C # Абстрактный метод наследования и скрытых методов непреднамеренно - PullRequest
1 голос
/ 19 сентября 2011

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

Я создаю базовый класс сущностей в качестве интерфейса для создания всех других сущностей в игре, над которой я работаю.

Из этого класса Entity я создал несколько производных классов. Существуют такие вещи, как MovingEntity, Trigger, Door и т. Д. Многие из этих дочерних классов также имеют дочерних производных. Например, у MovingEntity есть классы, такие как Projectile и EnemyUnit, как дети.

В моем базовом классе Entity у меня есть методы, такие как Update () и Render (), которые являются абстрактными, потому что я хочу, чтобы каждая сущность реализовала эти методы.

Однако, как только я перехожу на второй уровень, где я задаю свой вопрос / проблему. Я буду использовать класс Trigger, например. Trigger является производным от базового класса Entity, но у Trigger все еще есть свои дочерние элементы (например, TriggerRespawning и TriggerLimitedLifetime). Я не хочу создавать экземпляр объекта Trigger, поэтому я могу сохранить этот класс абстрактным - я буду создавать объекты только из дочерних классов Trigger. Но что мне делать с абстрактными методами, которые Trigger должен реализовывать из Entity?

Я думал, что могу просто использовать тот же код в Trigger, что и в Entity. Объявите тот же метод, то же имя, те же параметры, и просто назовите его абстрактным. Затем дети Триггера будут вынуждены реализовать реальные функции.

Однако это не сработало, потому что в классе Trigger мои ошибки сборки говорят о том, что я скрываю абстрактные методы от базового класса Entity.

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

До сих пор мне не удалось найти хорошего ответа на этот вопрос, поэтому я решил расстаться и спросить. Заранее спасибо, ребята.

1 Ответ

10 голосов
/ 19 сентября 2011

Только не переопределяйте методы вообще - возможные конкретные классы должны будут реализовать все абстрактные методы, все еще не реализованные на всем протяжении дерева:

public abstract class Foo
{
    public abstract int M();
}

public abstract class Bar : Foo
{
    // Concrete methods can call M() in here
}

public class Baz : Bar
{
    public override int M() { return 0; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...