哪个OO概念是“Base b = new Derived()”的一个例子?
我正在通过测试并遇到一个问题,我们没有与同事达成协议。
С++
1 class Base {}; 2 class Derived : public Base {}; 3 class Foo 4 { 5 public: 6 Foo() 7 { -8- Base* b = new Derived(); // Concept name is? 9 } 10 };
C#
1 abstract class Base{} 2 public class Derived : Base{} 3 4 public class Foo 5 { 6 public Foo 7 { -8- Base b = new Derived(); // Concept name is? 9 } 10 }
问题是:上面第8行是以下oo概念的一个例子
- 多态性
- 聚合
- 封装
- 抽象化
- 遗产
请提供一个知识来源答案的链接。
PS测试是breinbench上的’OO Concept’。 这是免费的。
更新:
从保护多态性的答案之一
“简单来说,多态性是一种类型A能够像其他类型一样出现和使用的能力,B。在强类型语言中,这通常意味着类型A以某种方式从类型B派生,或者类型A实现接口代表B型。“
来自维护遗产的维基百科
inheritance有时也称为泛化,因为is-a关系表示对象类之间的层次结构。
和
因此,inheritance具有另一种视图,即一种称为多态的双重视图,它描述了由共享控制代码控制的许多代码片段。
所以Base = new Derived()
显示’is a’( inheritance )。 其结果是多态性 。
所以我怀疑什么是对的?
这个问题很容易……这是多态性 。
由于inheritance,完成了多态行为。 您可以将Derived实例视为Base,因为Derivedinheritance自Base。 当应用于OO语言中的类型时,这是多态性的定义……
http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
[更新,更新]
我希望这已经足够明确了…这些都是说同样事情的不同方式。
多态性(C#编程指南)
“通过inheritance,类可以用作多种类型;它可以用作自己的类型,任何基类型,或任何接口类型,如果它实现接口。这称为多态。”
[更新]
鉴于评论,我将尝试更具体……我不是说因为Derivedinheritance自Base,该行是多态行为的一个例子,我说的是将一个实例赋值给一个类型的变量派生自多变性行为的一个例子。 引用我附上的链接的第一句话……
“在计算机科学中,多态性是一种编程语言特性,它允许使用统一的接口处理不同数据类型的值”
这意味着我可以将Derived的实例视为Base的一个实例,它表现出多态行为。 这并不依赖于类上虚拟方法的存在。
和来自不同来源的另一个引用……
“简单来说,多态性是一种类型A能够像其他类型一样出现和使用的能力,B。在强类型语言中,这通常意味着类型A以某种方式从类型B派生,或者类型A实现接口代表B型。“
真正的答案是:一个形成不良,因此毫无意义的问题。
这被认为是一个标准化的多项选择问题,但是你有多年经验的人没有达成共识。 应该达成的唯一结论是,作为对知识的衡量,它是无用的。
这个片段是关于inheritance的
概念的粗略总结
抽象是关于根据对象建模现实世界概念而不是考虑函数调用或其他东西的整个想法。 它基本上将对象视为单独的实体。
封装是将对象的实现隐藏在明确定义的接口之后的外部世界的行为。
inheritance是派生类和基类之间的关系以及概念的分类。 它定义了太多实体之间的“is-a”关系,增加了在期望基数的情况下使用派生类的能力。
多态性意味着两个对象在界面上相似但行为方式不同(想想virtual
方法)。
聚合定义了两个概念之间的“has-a”关系。 表示对象由另一个实体组成。
我认为答案的多样性表明这是一个构造不良的问题。
如果你把枪放在我的头上,我可能会选择inheritance ,因为这个模型,因为DerivedinheritanceBase,然后Derived可以在需要Base的地方使用(例如被Base *指向)但我可以想象保护任何答案。
如果我正在做出招聘决定,我会更倾向于听听候选人如何为自己选择的答案辩护,而不是选择哪一个。 但是,使用这样的测试的公司可能不是,或者没有任何人能够评估该级别的技能。
我已经说过多态性 ,因为这些类型可以相互分配,并且可以被视为它们是相同的。 您正在使用父接口来处理子类型的实例。
inheritance更多地是从父到子(也就是从基础到派生,从超级到子,从抽象到具体)inheritance成员和/或成员实现。
我将虚拟函数的解析视为具体实现的多态性特征,因此不会因示例中缺少虚函数解析而推迟。
答案是多态性。
见http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
。
这里的许多答案都会丢弃这个答案,因为没有虚函数调用。 但这只是多态性的一个例子(也是最常见的)。 但那不是唯一的。
最简单的多态性的定义很好地总结了维基百科的文章:
简单来说,多态性是一种类型A能够像另一种类型一样出现和使用的能力B.在强类型语言中,这通常意味着类型A以某种方式从类型B派生,或者类型A实现了一个接口,代表B型。
当然,第8行是一个似乎是Base
类型但实际上是Derived
类型的对象的例子
-
多态性
- 不,因为我们不进行虚拟方法的任何调用 – 并且不以任何其他方式使用多态行为
-
聚合
- 不,因为Base * b不是会员
-
封装
- 看不到我们封装的内容..除了构造函数的实现
-
抽象化
- 我想 – 是的 – 我们将使用更多抽象类然后创建
-
遗产
- base和derived之间的关系是inheritance – 但是你询问了赋值行
编辑
抽象通过建模适合于问题的类来简化复杂的现实,并在问题的给定方面以最合适的inheritance级别工作。
6. None of the above.
这是协方差的一个例子。
http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)
另见Liskov可译性原则:
http://en.wikipedia.org/wiki/Liskov_substitution_principle
我认为这里的简单代码最好被描述为子类型的一个例子( http://en.wikipedia.org/wiki/Subtype )。 在面向对象的编程术语中, 多态性是指子类改变或专门化基类中定义的行为的能力( http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming )。 这个例子并没有真正表明这一点。
在Brainbench上列出的选择中,我认为inheritance最有意义仅仅因为它最模糊。
它不是直接给出的任何选择。
它不直接与多态性有关,因为代码不通过基指针调用虚方法或删除指向基类的指针。
它不直接与inheritance有关,因为突出显示的代码不进行任何inheritance。第2行是关于inheritance。
它当然不是关于抽象,封装或聚合,因为它不是那些靠近那些东西的地方。
这个概念最直接的说明就是自动演员。