C#架构继承覆盖不同的签名?
我有三个类:C#架构继承覆盖不同的签名?,c#,inheritance,architecture,overriding,C#,Inheritance,Architecture,Overriding,我有三个类:CookedItem:conomableItem:Item 项实现此方法: protected void Initialize(string name,TypeItem type) {...} protected void Initialize(float duration,string name,TypeItem type) {...} conomableItem实现此方法: protected void Initialize(string name,TypeItem type
CookedItem
:conomableItem
:Item
项
实现此方法:
protected void Initialize(string name,TypeItem type) {...}
protected void Initialize(float duration,string name,TypeItem type) {...}
conomableItem
实现此方法:
protected void Initialize(string name,TypeItem type) {...}
protected void Initialize(float duration,string name,TypeItem type) {...}
现在我的问题来了。调用CookedItem
的正确方法是conomableItem.Initialize()
是否可以隐藏方法项.Initialize()以仅查看方法
conomableItem.Initialize()`
我无法使用覆盖
,因为签名不同
有什么建议吗?在您的类层次结构中,
初始化
方法是有效的,因此它们对于不在此继承层次结构中的类不可见,因此您可以为外部客户端设计更好的API
至于将方法隐藏在层次结构中,我认为这是不可能的,即使这些方法是虚拟的,编译器也不允许您更改这些方法的访问修饰符。
要了解更多关于为什么它被禁止的信息,请阅读
除了@Tolga-Evcimen提到的破坏LSP之外,拥有这种继承层次结构没有多大意义。
继承被认为是一种关系,现在它实际上是一个项,如果调用属于项的初始化方法没有意义/产生不一致的对象状态?您违反了实体的第三原则。利斯科夫替换原理。看一看,了解它是什么 基本上你建立了一个错误的继承
您应该做的是将
ICookable
和IConsumable
接口作为行为。然后您将有两个不同的item类实现(您仍然可以在一个抽象类中抽象它们).这是你应该使用构造函数的东西吗?No-CookeEdItem
是一个ConsomableItem
并且间接地是一个项
,因此它对这两个函数都有权限。我不能使用构造函数,因为我使用的是Unity,但感谢你的建议。p想对继承自的CookeEdItem
隐藏函数Item
@DStanley-我理解这是不可能的-我已经解释了原因