【问题标题】:Is there an access modifier that I can use hiding a abstract method from being called in a derived type?是否有一个访问修饰符可以用来隐藏抽象方法以防止在派生类型中被调用?
【发布时间】:2011-01-08 00:40:03
【问题描述】:

假设我有一个派生自抽象类 2 的类 1。 Class2 有一个抽象方法,每个派生类都必须重写该方法。在我的设计中,只有将 class1 转换为 class2 时才会调用该方法。当它被转换为class1时,有没有办法隐藏这个方法?如果不只是想知道的话,对我来说并不是什么问题。如果可能,这是一个好/坏主意,为什么?谢谢!!!

【问题讨论】:

  • 这有什么意义?
  • “隐藏”是什么意思?其次,知道为什么需要这样做会非常有用。
  • 关键是派生类需要这个方法,因为每个派生类都不同,但只有在派生类型转换为基类型时才会调用。基本上只是有一个较少可用的方法来调用派生类型,因为它不需要。

标签: c# inheritance


【解决方案1】:

您可以使用显式接口实现来实现类似的效果。要调用显式实现的接口方法,您需要强制转换为接口。

【讨论】:

    【解决方案2】:

    我严重怀疑。这不是继承在面向对象设计中的工作方式。

    如果 Class1 没有 Class2 抽象方法,那么它不应该从 class2 继承。

    想象一个用户有一个 class2 的集合,并在其中的每一个上调用 .abstractMethod()。后来有人向它添加了一个 Class1 的实例。

    这些程序员都没有做错任何事情,但代码仍然无法正常工作。

    考虑在此处再添加一层抽象,以便顶级抽象具有所有要素 class1 和 class2,并且它们都继承自它。 Class2 然后添加 abstractMethod。

    【讨论】:

      【解决方案3】:

      这是一个坏主意,因为它违反了 SOLID 原则,尤其是该原则的 L 部分。如果其他人试图使用您的派生类,并且知道继承自已经具有该方法的基类,那么他会对不完整的实现感到非常困惑,特别是因为它是一个抽象方法。接口是要走的路,如前所述,您可以定义显式实现并有效地隐藏方法。

      【讨论】:

      • 我认为有一个可以被覆盖但不能在派生类中调用的方法很有意义。问题是这阻止了从派生到基本方法的通常转发。 Afaik C++ 支持类似的东西,即私有虚拟方法。
      猜你喜欢
      • 2013-08-09
      • 1970-01-01
      • 2018-06-26
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      相关资源
      最近更新 更多