Наследование статического поля абстрактного класса С#

Мне кажется, что я пропустил класс С# или два, но вот моя дилемма:

У меня есть абстрактный класс, из которого я получаю несколько дочерних классов.

Я точно знаю, что для каждого из дочерних классов у меня будет конструктор, которому нужен определенный статический объект в качестве модели, и этот объект будет отличаться для каждого из дочерних классов.

Мой первый подход состоял в том, чтобы создать публичный статический объект в абстрактном родительском классе, а затем, прежде чем я начну создавать какие-либо экземпляры дочерних классов, я бы изменил его для каждого из них, но оказывается, что таким образом я на самом деле сделать только ОДИН статический объект, для абстрактного класса, и каждый из его дочерних классов использует его.

Как я могу решить проблему?

Чтобы быть более точным, вот псевдокод:

Родительский абстрактный класс:

 abstract class AbstractClass
{
   static public ModelObject Model;
   ...
}

Один из дочерних классов:

class Child : AbstractClass
{
    ...
    public Child()
    {
        this.someField = Model.someField;
    }
}

EDIT:

Модель должна быть членом класса ModelObject, она не должна быть ничем и ничем иным.

EDIT2:

Чтобы быть точнее, я выбрал эту реализацию для игры в шахматы: у меня есть абстрактный класс для шахматных фигур, а дочерние классы представляют собой конкретные фрагменты игры: пешки, рыцари и т.д.

Абстрактный класс наследует от MeshMatObject, класс, который представляет общие 3D-объекты с базовой функциональностью, такие как вращения, сетки, материалы, текстуры и т.д., и он определяет абстрактные методы для частей шахматной игры, такие как GetPossibleMoves().

Объект Model, о котором я говорил выше, является членом MeshMatObject и, на мой взгляд, должен быть определен за пределами класса только один раз, а затем использоваться для всех частей. Я имею в виду: например, все пешки имеют одинаковую сетку и текстуру, поэтому я не вижу смысла давать модель в качестве параметра каждый раз, когда вы хотите сделать пешку.

Ответы

Ответ 1

Я использую нечто похожее на решение @shf301. В зависимости от ваших потребностей может оказаться полезным настроить базовый класс следующим образом:

abstract class AbstractClass
{
}

abstract class AbstractClass<TModel> : AbstractClass
    where TModel : ModelObject 
{
   static public TModel Model;
   ...
}

Это позволяет мне общий базовый класс, с которым я могу работать в не общих функциях. Это также позволяет производным типам выбирать точный тип модели и может сокращать литье.

Ответ 2

Вы можете обойти общее статическое поле, создав свой абстрактный класс. Каждый родовой класс получит свою собственную копию статических полей.

abstract class AbstractClass<T>
{
   static public ModelObject Model;
   ...
}

Затем каждый дочерний класс будет использовать другой экземпляр статического поля.

class Child : AbstractClass<Child>
{
    ...
    public Child()
    {
        this.someField = Model.someField;
    }
}

Не имеет значения, что AbstractClass не ссылается на общий параметр. Вы используете его только для того, чтобы дать каждому дочернему классу уникальный экземпляр базового класса.

Ответ 3

Как насчет factory отделить классы от унаследованной модели:

public static class ModelObjectFactory
{
    public static ModelObject GetModel<T>(T obj)
    {
        // return ModelObject according to type of parameter
    }
}

class Child
{
    public Child()
    {
        ModelObject mo = ModelObjectFactory(this);
        this.someField = mo.someField;
    }
}