我有一个带有多个子类的抽象类(截至目前已有20多个子类),并且我只希望在两个子类之间共享一个代码和变量。
如果我将方法和变量放在超类中,那么所有子类都可以访问它们,但是我希望只有两个子类可以访问它们,并且基本上知道它们的存在。 有没有办法做到这一点?
谢谢
答案 0 :(得分:5)
您可以通过应用composition instead of inheritance原理来解决该问题:创建一个新类,其中包含应在2个子类之间共享的功能,并使用对2个子类中新类实例的引用。
这样,您将避免在子类和超类之间添加额外的层,并且您的代码将更加灵活且易于维护。
几乎不建议在超级类中添加一些共享功能并通过继承获取它时,通常建议使用这种方法。如有疑问,请始终问问自己, HAS-A关系(组成)是否比 IS-A关系(继承)更合适。
尽管将一个超级类中的多个功能分组在一起可能会有所帮助,但是如果您需要在多个类之间共享一个功能,那么使用组合来实现它可能更合适。
答案 1 :(得分:2)
计算机科学中的所有问题都可以通过另一种间接解决方案解决。(通过David Wheeler)
因此,您只需创建另一个(抽象)类即可扩展您的基类,并添加您仅在那些特定子类中需要的那些通用内容。
以上引用并非总是正确的,但至少在概念上是 ,另一种有用的抽象通常是解决设计问题的最佳方法。
答案 2 :(得分:1)
除了继承,您还可以使用组合。创建另一个类,并将您的方法和变量放入其中,并在您的2个类中对此新类进行引用。同样,使用正确的打包和访问修饰符,您仅能从这两个客户端类中访问新类。 希望对您有所帮助。
答案 3 :(得分:0)
让我们创建一个实际的示例,以便您可以了解如何解决此问题。
我们有一个名为Alive
的课程。我们将其用作Dog
,Wolf
和Human
的父类。我们需要Dog
和Wolf
拥有方法growl()
的地方,但是Human
不需要。
class Alive{
abstract void smell(){};
abstract void see(){};
abstract void hear(){};
}
class Canis extends Alive{
abstract void growl(){};
}
class Human extends Alive{
}
class Dog extends Canis{
}
class Wolf extends Canis{
}
这是继承层次结构的示意图:
Alive
/ \
/ \
/ \
Human Canis
/ \
/ \
Dog Wolf
答案 4 :(得分:-1)
您可以从基类扩展抽象类,将要共享的方法放在该类中,然后从新的中间件类扩展要共享的两个类。