2017-01-17 22 views
2

У меня есть три класса: CookedItem: ConsomableItem: ItemC# архитектура inheritage переопределяет другую подпись?

Item реализует этот метод:

protected void Initialize(string name,TypeItem type) {...} 

ConsomableItem реализует этот метод:

protected void Initialize(float duration,string name,TypeItem type) {...} 

Теперь вот моя проблема. Правильный метод для вызова CookedItem - ConsomableItem.Initialize().

Могу ли я скрыть метод Item.Initialize() to only see the method ConsomableItem.Initialize() `?

Я не могу использовать override, потому что подписи разные.

Любое предложение?

+1

Для этого вы должны использовать конструкторы? –

+0

Нет - 'CookedItem' является' ConsomableItem' и косвенно 'Item', поэтому он имеет права на обе функции. –

+0

Я не могу использовать конструкторы, потому что я использую Unity, но спасибо за предложение – CrymX

ответ

0

В вашей иерархии классов Initialize методы protected, поэтому они не будут видны на классы, которые не являются в этой иерархии наследования, так что до вас, чтобы разработать лучший API для внешних клиентов.

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

В дополнение к взлому LSP, как упоминалось @Tolga Evcimen, он не делает много смысла, чтобы иметь эту иерархию наследования. Наследование считается is-a отношений, теперь CookedItem действительно Item, если вызывающие Initialize методы, принадлежащие к элементу, не имеют смысла/дают противоречивое состояние объекта?

+1

OP хочет скрыть эту функцию из 'CookedItem', которая наследуется от' Item'. –

+0

@DStanley - Я понимаю, что, однако, это невозможно - я добавил объяснение, почему – ironstone13

2

Вы нарушаете третий принцип SOLID. Принципа заместителя Лискова. Посмотрите на here, чтобы понять, что это такое.

В принципе, вы создали неправильное наследование.

Что вы должны делать, это ICookable и IConsumable интерфейсы, как и поведения. Тогда у вас будет две различные реализации класса элементов (вы все же можете абстрагировать их в абстрактном классе).

 Смежные вопросы

  • Нет связанных вопросов^_^