C#架构继承覆盖不同的签名?

时间:2017-01-17 19:37:37

标签: c# inheritance architecture override

我有三个课程:CookedItemConsomableItemItem

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,因为签名不同。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您违反了SOLID的第三个主体。 Liskov替换校长。看看here,了解它是什么。

基本上你构建了一个错误的继承。

您应该做的是ICookableIConsumable接口作为行为。然后你将有两个不同的项类实现(你仍然可以在抽象类中抽象它们)。

答案 1 :(得分:0)

在您的类层次结构中Initialize方法是protected,因此它们对于不在此继承层次结构中的类是不可见的,因此您需要为<设计更好的API strong>外部客户。

至于隐藏内部层次结构的方法,我认为这是不可能的,即使方法是虚拟的,编译器也不允许你更改方法的访问修饰符。 要了解有关禁止原因的更多信息,请阅读here

除了像@Tolga Evcimen所提到的破坏LSP之外,拥有这种继承层次结构并没有多大意义。 继承被认为是 is-a 关系,现在CookedItem实际上是Item,如果调用属于item的Initialize方法没有意义/收益不一致的对象状态?