java - 应用继承和代码重用的最佳方法

标签 java typescript oop

我有一个关于在基类中的某些方法在继承类中没有意义的情况下构建代码以便通过继承重用的最佳方法的问题。 我认为这是一个普遍的 OOP 问题,而不仅仅是 TypeScript 所特有的......

基本上,在某种形式的伪代码中,问题与此类似:

类基类 对A有意义 对A有意义 .... 对A来说没有意义 对A来说没有意义 ....

那么如何让A类继承BaseClass。仅直接继承意味着 A 类 将具有没有真正意义的成员方法。

不使用继承意味着代码将在 BaseClassClass A 中重复

makesSenseForA 方法移至外部类,并让 BaseClass 及其子类依赖于此提取的类(即使用组合),在此特定场景中不起作用,因为提取的类实际上应该被视为 A BaseClass

处理这种 OOP 建模情况的最佳方法到底是怎样的?

编辑: 由于缺乏更好的例子,这就像尝试对人类和机器人进行建模 - 这两者将共享大量类似的实现,因此首先想到的可能是拥有 >赛博格扩展了人类...

但也会有大量的实现是人类拥有而Cyborg不应该拥有的。

取消继承意味着那些类似的功能必须在 Human 和 Cyborg` 中重复。

组合也不起作用,因为如果您将那些类似的实现提取到一个单独的对象中,则该对象及其方法将具有 Human 属性,因此应被视为我们建模中的一个人类

最佳答案

是的,这确实是一个常见问题。但您的示例并不是对继承的非常准确的引用。我们主要使用继承并不是因为通用功能。为了重用它们,可以将常用函数编写为实用程序/实用程序类。当一个类基本上是父类的子类型时,您就继承了一个类,并且我们为不是实际对象而是类型的事物创建接口(interface)。例如:

  • 界面:动物
  • 类别:Tiger 实现 Animal
  • 类:山羊实现动物

请注意,动物本身不能被客观化。现在,尽管 GoatTiger 类的许多功能都是通用的,但它们都不应该扩展另一个类,因为方法 hunt() 对 Goat 类没有意义,而 graze()Tiger 没有意义。为此,我们使用接口(interface)。现在,要在同一个类中移动通用函数,您可以进一步打破这种模块化:

  • 食肉动物类扩展了动物
  • 草食动物类扩展了动物

猜测 GoatTiger 现在将实现什么,无需加分。如果由于某种原因无法在 Animal 类中编写一些常用函数,您可以将它们编写为实用程序。假设您有一只机器山羊,它与实际山羊具有许多常见功能,您无需扩展 Goat,而是将常见功能作为实用程序移动,例如 GoatUtilities

编辑:有人指出,实用程序类并不完全是 OOP,而是过程性的......但他们绝对可以称赞您的类,以帮助他们以正确的方式遵循 OOP。这就是为什么它们是“实用”类。所以,这就是被忽略的一点,我试图基本上指出的是,在给定的示例中,继承是如何被误解/误用的,这在某种程度上导致了有点违反 OOP 原则的问题。拥有可行的面向对象设计并不意味着您不应该使用实用程序类,因为目标是应用继承和代码重用。

关于java - 应用继承和代码重用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60074143/

相关文章:

java - netty 套接字 io CORS 错误 : Access-Control-Allow-Origin

angularjs - 使用 typescript 将文件上传到 Controller

angular - 如何在 Jest 中模拟 router.navigate 方法

c# - 如何扩展继承的方法而不是覆盖它?

PHP 绑定(bind) PDO 数组

php - PDO 不执行语句

java - 改造返回空对象

java - AlertDialog.Builder 不是语句

angular - "export ' 鼠标 ' (imported as ' d3 ') was not found in ' d3'

java - Android 中如何调用标准的原生方法?