如何在一些子类之间共享代码?
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
。我们将使用它作为 Dog
、Wolf
和 Human
的父级 class。我们需要 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
您可以通过应用 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。
希望对你有帮助。
我有一个抽象 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
。我们将使用它作为 Dog
、Wolf
和 Human
的父级 class。我们需要 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
您可以通过应用 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。 希望对你有帮助。