C # полиморфизм еще раз - виртуальные свойства - PullRequest
0 голосов
/ 06 апреля 2009

На этот раз у меня проблема с виртуальными полями.

У меня есть базовый класс для моих игровых объектов. Этот класс содержит поле с объектом класса Model. Объект модели содержит такие значения, как положение и т. Д.

Теперь - во время рисования мне нужно прочитать положение каждого объекта из его модели. Проблема начинается, когда вместо класса модели по умолчанию я использую производную. Пример:

abstract class GenericGameObject { public DefaultGameObjectModel Model = new DefaultGameObjectModel(); }
class Plane : GenericGameObject { public void shoot(Missile m){ m.Model.Position.X = 10; } }
class Missile : GenericGameObject { public new MissileModel Model = new MissileModel(); }

class DefaultGameObjectModel { public Vector2 Position = new Vector2(){X=0}; }
class MissileModel : DefaultGameObjectModel { }

Plane p = new Plane();
Missile m = new Missile();
p.shoot(m);
// NOT OK! ((GenericGameObject)m).Model.Position.X == 0

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

Ответы [ 2 ]

3 голосов
/ 06 апреля 2009

Похоже, ваш GenericGameObject должен быть универсальным типом, где параметр типа происходит от DefaultGameObjectModel:

abstract class GenericGameObject<TModel>
    where TModel : DefaultGameObjectModel
{
     private TModel model;

     // Or whatever
     public TModel Model
     {
         get { return model; }
         protected set { model = value; }
     }
}
1 голос
/ 06 апреля 2009

Вы также можете создать интерфейс IGameObjectModel и затем реализовать его в каждом из ваших классов объектной модели. Ваш GameObject будет иметь экземпляр IGameObjectModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...