Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何摆脱继承_Oop_Inheritance_Architecture_Interface_Extend - Fatal编程技术网

Oop 如何摆脱继承

Oop 如何摆脱继承,oop,inheritance,architecture,interface,extend,Oop,Inheritance,Architecture,Interface,Extend,我在这里和其他论坛上搜索过,没有找到好的答案。。 我知道扩展类不是最好的实践。我应该更多地使用接口。我的问题是,通常我开始创建接口,然后转向抽象类,因为总有一些功能我希望在一个超类上实现,这样我就不必在每个子类中复制它。 例如,我有一个车辆类和汽车和自行车儿童类。很多功能可以在Vehicle类上实现,比如Move()和Stop(),那么保持体系结构整洁、避免代码重复以及使用接口而不是继承的最佳实践是什么呢? 非常感谢 (如果你不知道我为什么问这个问题,你可以读这篇有趣的文章:)你想知道你的具体案

我在这里和其他论坛上搜索过,没有找到好的答案。。 我知道扩展类不是最好的实践。我应该更多地使用接口。我的问题是,通常我开始创建接口,然后转向抽象类,因为总有一些功能我希望在一个超类上实现,这样我就不必在每个子类中复制它。 例如,我有一个车辆类和汽车和自行车儿童类。很多功能可以在Vehicle类上实现,比如Move()和Stop(),那么保持体系结构整洁、避免代码重复以及使用接口而不是继承的最佳实践是什么呢? 非常感谢


(如果你不知道我为什么问这个问题,你可以读这篇有趣的文章:)

你想知道你的具体案例的答案,还是一般的答案?在您描述的例子中,使用抽象类没有什么错。当所有客户端都需要为Move()和Stop()实现完全相同的代码时,使用接口是没有意义的。

有趣的问题。每个人都有不同的方法。但这一切都是基于个人经验和选择

通常,我从一个接口开始,然后让一个抽象类继承该接口。并在那里实现公共操作,并让继承该类的人实现其他操作

这在经验的基础上没有什么优势,
1.在函数调用期间,可以将元素作为接口类型或抽象类类型传递。
2.ID、名称等常用变量可以放在抽象类上。
3.易于维护。例如,如果您想实现一个新接口,那么只需快速抽象地实现即可。

  • 不要相信你读到的一切

    • 很多时候,继承并不坏,事实上,对于数据隐藏来说,它可能是一个好主意
  • 基本上,在创建非常小的类树时,只使用“仅接口”策略,否则,我保证这将是一个痛苦的过程。假设你有一个人“类”(has
    eat()
    sleep
    ),有两个子类,数学家(has
    doProblem()
    )和工程师(buildSomething()),然后使用接口。如果你需要像汽车类这样的东西,然后需要5600万种类型的汽车,那么就使用继承

IMHO.

继承(“扩展类”)对类设计施加了很大的限制,我不确定使用接口替代继承是最好的主意,因为它没有通过干式测试


现在,构图优于继承,所以你可以考虑这篇文章:

同意Futum——在你当前的例子中,在车辆上移动和停车是合理的。

读了这篇文章后,我认为这是在用强有力的语言来推动一个观点。。。记住——继承是一种帮助完成工作的工具

但是,如果我们假设无论出于何种原因,在这种情况下您不能/不会使用该工具,那么您可以首先将其分解为具有辅助对象和/或访问者的小界面

例如— 车辆类型包括潜艇、船、飞机、汽车和自行车。你可以把它分解成接口。。。 不可移动 +前进() +向后() +左() +右()

无效的 +码头()

ISink() +吹风

IFly() +起飞() +土地(

然后,您的类可以聚合您刚才定义的大量接口

问题是,您可能会在car/bike类中为imovable.Left()和imovable.Right()复制一些代码。您可以将其分解为一个helper方法并聚合helper。。。但如果您遵循它的逻辑结论,您仍然会将许多东西重构回基类

继承和聚合是工具。。。两者都不是“邪恶”


希望这会有所帮助。

如果您记住接口和类之间的根本区别,将更容易决定使用哪一种接口和类。不同之处在于,接口只表示所涉及对象之间的协议(通常是行为的),而抽象类表示一些涉及某些部分(数据)的未完成构造。在汽车示例中,接口本质上是通用汽车的蓝图。抽象类类似于预制的特定模型车身,需要用剩余零件填充以获得最终产品。接口甚至不必是Java的——它不会改变任何东西——仍然是蓝图

通常,您会在特定的实现框架中使用抽象类为其使用者提供一些基本功能。若你们只是声明你们从不使用抽象类来支持接口,那个么从实际的角度来看,这是完全错误的。如果您需要10个相同接口的实现,其中90%的代码相同,该怎么办。复制代码10次?好的,也许你们会在这里使用抽象类,但把接口放在上面。但是,如果您从未打算向外部使用者提供类层次结构,为什么要这样做呢? 我在非常广泛的意义上使用单词external——它可以是项目中的不同包,也可以是远程消费者

归根结底,这些都是偏好和个人经历,但我不同意大多数笼统的说法,如
extends is evil
。我也不喜欢使用额外的类(接口或抽象),除非设计的特定部分需要它


只有我的两分钱。

我想,那有时也是邪恶的。它们可以避免多重继承

但若我们将接口和抽象类进行比较,那个么抽象类总是多于接口。接口总是类的某个方面——某个视点,而不是作为一个类的整体

所以我不认为你应该避免继承而使用iterfac