如何在某些子类之间共享代码?

时间:2019-06-30 09:10:59

标签: java oop access-modifiers

我有一个带有多个子类的抽象类(截至目前已有20多个子类),并且我只希望在两个子类之间共享一个代码和变量。

如果我将方法和变量放在超类中,那么所有子类都可以访问它们,但是我希望只有两个子类可以访问它们,并且基本上知道它们的存在。 有没有办法做到这一点?

谢谢

5 个答案:

答案 0 :(得分:5)

您可以通过应用composition instead of inheritance原理来解决该问题:创建一个新类,其中包含应在2个子类之间共享的功能,并使用对2个子类中新类实例的引用。

这样,您将避免在子类和超类之间添加额外的层,并且您的代码将更加灵活且易于维护。

几乎不建议在超级类中添加一些共享功能并通过继承获取它时,通常建议使用这种方法。如有疑问,请始终问问自己, HAS-A关系(组成)是否比 IS-A关系(继承)更合适。

尽管将一个超级类中的多个功能分组在一起可能会有所帮助,但是如果您需要在多个类之间共享一个功能,那么使用组合来实现它可能更合适。

答案 1 :(得分:2)

计算机科学中的所有问题都可以通过另一种间接解决方案解决。(通过David Wheeler

因此,您只需创建另一个(抽象)类即可扩展您的基类,并添加您仅在那些特定子类中需要的那些通用内容。

以上引用并非总是正确的,但至少在概念上是 ,另一种有用的抽象通常是解决设计问题的最佳方法。

答案 2 :(得分:1)

除了继承,您还可以使用组合。创建另一个类,并将您的方法和变量放入其中,并在您的2个类中对此新类进行引用。同样,使用正确的打包和访问修饰符,您仅能从这两个客户端类中访问新类。 希望对您有所帮助。

答案 3 :(得分:0)

让我们创建一个实际的示例,以便您可以了解如何解决此问题。

我们有一个名为Alive的课程。我们将其用作DogWolfHuman的父类。我们需要DogWolf拥有方法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)

您可以从基类扩展抽象类,将要共享的方法放在该类中,然后从新的中间件类扩展要共享的两个类。