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

How to share code between some of the subclasses?

我有一个抽象 class 有多个子 classes(截至目前超过 20 个)并且有一个代码和变量我想只在 2 个 Sub 之间共享-classes。

如果我将方法和变量放在 Super-class 中,那么所有 Sub-classes 都可以访问它们,但我只希望 Sub-class 中的 2 个-classes 将可以访问它们并且基本上会知道它们存在。 有办法实现吗?

谢谢

计算机科学中的所有问题都可以通过另一个间接层次来解决。(by David Wheeler

因此只需创建另一个(抽象的)class 来扩展您的基础 class 并添加那些您只需要在那些特定子 class 中使用的通用内容。

上面的引述并不总是正确的,但至少概念上,另一个有用的抽象通常是最好的出路设计问题。

你可以从基础class扩展抽象class,把你想共享的方法放在这个class中,然后扩展两个class您想共享新中间件 class.

中的方法

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

我们有一个 class 叫做 Alive。我们将使用它作为 DogWolfHuman 的父级 class。我们需要 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    

您可以通过应用 composition instead of inheritance 原则来解决它:创建一个新的 class 包含应该在 2 个子 class 之间共享的功能并使用对2 subclasses.

内的新 class 实例

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

当向 super-class 添加一些共享功能并通过继承获得它感觉不自然时,几乎总是建议使用这种方法。如有疑问,请始终问自己 HAS-A 关系 (组合)是否比 IS-A 关系(继承)。

虽然将多个功能组合在一个 super-class 中可能会有所帮助,但如果您需要在多个 class 之间共享一个功能,可能使用组合来实现它会更合适.

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