【问题标题】:C# architecture inheritage override different signature?C#架构继承覆盖不同的签名?
【发布时间】:2017-06-02 00:17:42
【问题描述】:

我有三个班级: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 methodConsomableItem.Initialize()`方法吗?

我不能使用override,因为签名不同。

有什么建议吗?

【问题讨论】:

  • 这是你应该使用构造函数的东西吗?
  • 否 - CookedItemConsomableItem 和间接 Item 因此它拥有这两个功能的权利。
  • 我不能使用构造函数,因为我正在使用 Unity 但感谢您的建议

标签: c# inheritance architecture overriding


【解决方案1】:

您违反了 SOLID 的第三个原则。 Liskov 替代校长。看看here 了解它是什么。

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

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

【讨论】:

    【解决方案2】:

    在你的类层次结构中Initialize 方法是protected,所以它们对不在这个继承层次结构中的类是不可见的,所以你可以为 external 客户。

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

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

    【讨论】:

    • OP 想要隐藏继承自 ItemCookedItem 的函数。
    • @DStanley - 我明白这是不可能的 - 我已经添加了解释原因
    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2015-02-14
    • 2018-05-09
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多