На этот раз у меня проблема с виртуальными полями.
У меня есть базовый класс для моих игровых объектов. Этот класс содержит поле с объектом класса Model. Объект модели содержит такие значения, как положение и т. Д.
Теперь - во время рисования мне нужно прочитать положение каждого объекта из его модели. Проблема начинается, когда вместо класса модели по умолчанию я использую производную. Пример:
abstract class GenericGameObject { public DefaultGameObjectModel Model = new DefaultGameObjectModel(); }
class Missile : GenericGameObject { public new MissileModel Model = new MissileModel(); }
class DefaultGameObjectModel { public Vector2 Position = new Vector2(){X=0}; }
class MissileModel : DefaultGameObjectModel { }
Missile m = new Missile();
m.Model.Position.X = 10;
// NOT OK! ((GenericGameObject)m).Model.Position.X == 0
Я пытался сделать Модель определяемой как виртуальное свойство вместо поля, но это не удалось, потому что
производные свойства должны быть того же типа, что и их база. Кастинг бесполезен, потому что будет много других типов моделей. Что я могу сделать, если я хочу прочитать значение из производного класса, а не из базы?
Я уже задавал этот вопрос, но ответ не принес никакого решения. Explaination:
для использования интерфейса IGameObjectModel
Концепция хороша, но я должен применять поля. Интерфейсы не могут определять поля, поэтому я должен определить свойство. Но тогда я не могу сделать IGameObjectModel.Position.X = 10, потому что Position не является полем.
, чтобы сделать GenericGameObject универсальным типом, таким как GenericGameObject и Missile тип, производный от GenericGameObject
Я не мог тогда бросить ракету в GenericGameObject и вообще сохранить эти объекты в том же списке. Конечно, я мог бы создать основной базовый тип, от которого могли бы наследовать эти два, но тогда у меня не было бы доступа к полю Model.
, чтобы сделать модель свойством вместо поля.
Невозможно изменить тип свойства в производном классе.
Что я могу сделать?