![]() |
1
10
如果您将没有显式重写的所有内容委托给实现相同接口的其他对象(“基”对象),那么基本上您已经在组合的基础上对继承进行了绿色屏蔽,但(在大多数语言中)的详细程度和样板文件要多得多。使用组合而不是继承的目的是使您只能委托希望委托的行为。 如果希望对象使用基类的所有行为,除非显式重写,那么继承是表达它的最简单、最不冗长、最直接的方法。 |
![]() |
2
46
这是你的根本错误。几乎完全相反。这个 初级的 (公共)继承的目的是建模相关类之间的关系。多态性是其中很大一部分。 如果使用正确,继承并不是关于重用现有代码。相反,它是关于被使用 通过 现有代码。也就是说,如果现有的代码可以与现有的基类一起使用,那么当从现有的基类派生新的类时,其他代码现在也可以自动与新的派生类一起使用。 可以使用继承来重新使用代码,但当/如果这样做时,通常应该是 私有的 继承不是公共继承。如果您使用的语言很好地支持委托,那么您很少有足够的理由使用私有继承,这是很有可能的。Otoh,私有继承确实支持委托(通常)不支持的一些事情。特别是,尽管多态性在本例中是一个明显的次要问题,但是它 可以 仍然是一个问题——即,对于私有继承,可以从 几乎 你想要什么,并且(假设它允许)覆盖那些不太正确的部分。 对于委托,您唯一真正的选择是完全按照现有类的原样使用现有类。如果它不能完全满足您的需求,那么您唯一真正的选择就是完全忽略该功能,并从头开始重新实现它。在某些情况下,这不是损失,但在其他情况下,这是相当可观的。如果基类的其他部分使用多态函数,私有继承允许您重写 只有 多态函数和其他部分将使用重写函数。使用委托,您无法轻松地插入新功能,因此现有基类的其他部分将使用您已重写的内容。 |
![]() |
3
16
使用继承的主要原因是 不 作为一种组合形式,你可以获得多态行为。如果不需要多态性,则至少不应该使用继承,至少在C++中是这样。 |
![]() |
4
7
每个人都知道多态性是继承的一大优势。我在继承中发现的另一个好处是帮助创建真实世界的复制品。例如,在工资单系统中,我们处理经理、开发人员、办公室职员等,如果我们继承了所有这些类,并拥有高级员工。这使得我们的课程在现实世界中更容易理解,所有这些课程基本上都是员工。还有一件事,类不仅包含方法,还包含属性。所以如果我们在雇员中包含雇员通用的属性 类,如社会保险号年龄等,它将提供更大的代码重用和概念清晰性,当然还有多态性。然而,在使用继承的时候,我们应该记住的是基本的设计原则“识别应用程序中变化的方面,并将它们与变化的方面分开”。您不应该实现那些通过继承而改变的应用程序方面,而应该使用组合。对于那些不可改变的方面,如果一个明显的“是”关系存在的话,当然应该使用继承。 |
![]() |
5
6
如果出现以下情况,则优先选择继承:
我的结论是:委托是解决编程语言中错误的一种方法。 |
![]() |
6
4
在使用继承之前我总是三思而后行,因为它很快就会变得棘手。也就是说,在许多情况下,它只生成最优雅的代码。 |
![]() |
7
3
接口只定义对象可以做什么,而不定义如何做。所以简单来说,接口只是契约。实现接口的所有对象都必须定义自己的合同实现。在现实世界中,这给了你
对接口进行编码意味着,客户机代码始终持有由工厂提供的接口对象。工厂返回的任何实例都属于接口类型,任何工厂候选类都必须实现该类型。这样,客户机程序就不担心实现,接口签名决定了所有操作都可以做什么。这可用于在运行时更改程序的行为。它还可以帮助您从维护的角度编写更好的程序。 下面是一个基本的例子。
|
![]() |
8
2
模板方法模式怎么样?假设您有一个基本类,其中包含大量可自定义策略的点, 但是 策略模式至少有一个原因是不合理的:
|
![]() |
9
0
你写道:
在大多数语言中,“实现接口”和“从另一个类派生类”之间的界限非常窄。事实上,在C++语言中,如果从类A派生类B,而A是纯纯方法所组成的类,则 是 实现接口。 继承是关于 接口重用 不是 实现重用 . 它是 不 关于代码重用,如上所述。 正如您正确指出的,继承是为了建立一种IS-A关系模型(事实上许多人都犯了这个错误,这本身与继承无关)。你也可以说“像A一样的行为”。然而,仅仅因为某个事物与其他事物有IS-A关系并不意味着它使用相同(甚至相似)的代码来实现这种关系。 比较这个C++示例,它实现了不同的方法来输出数据;两个类使用(public)继承,以便它们可以多态访问:
现在想象一下这是Java。输出“”不是结构,而是“接口”。它可能被称为“可写”。您可以说“实现可写”,而不是“公共输出”。在设计上有什么不同? 一个也没有。 |
![]() |
10
0
经典继承的主要用途是,如果您有许多相关的类,这些类对于对实例变量/属性进行操作的方法具有相同的逻辑。 有三种方法可以解决这一问题:
现在,继承权可能被滥用。例如,Java具有类
|
![]() |
11
0
我看到的使用继承的最有用的方法之一是在GUI对象中。 |
![]() |
12
0
当你问:
答案是否定的。如果模型不正确(使用继承),那么不管使用什么都是错误的。 我看到了一些继承问题:
|
![]() |
13
0
一些完全不是OOP的东西,但是,组合通常意味着额外的缓存丢失。这取决于数据的接近程度。 一般来说,我拒绝参加一些宗教斗争,用你自己的判断和风格是你能得到的最好的。 |
![]() |
Schadre · C-plus编码错误 2 年前 |
![]() |
Nithin K · 即使类属性的类型正确,也会获取异常 2 年前 |
![]() |
amirreza870 · Python OOP-更改类文本 2 年前 |
![]() |
A_K · 使用cat或打印方法打印部分内容的子集闭包 2 年前 |
![]() |
Mo Fatah · 如何使用Python类打印数独板? 3 年前 |