Наследование статического поля абстрактного класса С#
Мне кажется, что я пропустил класс С# или два, но вот моя дилемма:
У меня есть абстрактный класс, из которого я получаю несколько дочерних классов.
Я точно знаю, что для каждого из дочерних классов у меня будет конструктор, которому нужен определенный статический объект в качестве модели, и этот объект будет отличаться для каждого из дочерних классов.
Мой первый подход состоял в том, чтобы создать публичный статический объект в абстрактном родительском классе, а затем, прежде чем я начну создавать какие-либо экземпляры дочерних классов, я бы изменил его для каждого из них, но оказывается, что таким образом я на самом деле сделать только ОДИН статический объект, для абстрактного класса, и каждый из его дочерних классов использует его.
Как я могу решить проблему?
Чтобы быть более точным, вот псевдокод:
Родительский абстрактный класс:
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;
}
}