(迂腐的问题)
根据wikipedia,有3种类型的多态性:
指的是可以应用于参数的多态函数 不同的类型,但根据类型的不同而表现不同 它们应用的论据
换句话说:重载:
function Add( x, y : Integer ) : Integer;
...
function Add( s, t : String ) : String;
允许函数或数据类型一般写入,以便它 可以相同地处理值而不依赖于它们的类型
换句话说:泛型
示例:
class List<T> {
class Node<T> { ...
允许写一个函数来获取某个类型T的对象, 如果传递属于类型S的对象,也可以正常工作 这是T
的子类型
(最常见的用法)
示例:
abstract class Animal {
abstract String talk();
}
class Cat extends Animal {
String talk() {
return "Meow!";
}
}
...
另一个例子:
class Animal
{
public virtual void eat()
{
Console.Write("Animal eating");
}
}
class Dog : Animal
{
public override void eat()
{
Console.Write("Dog eating");
}
}
太棒了。
现在我想告诉你接口的定义:
接口 - 界面定义了可以通过以下方式实施的合同 类和结构。一个接口可以包含方法,属性, 事件和索引器。接口不提供实现 它定义的成员 - 它只是指定必须的成员 由实现接口的类或结构提供。
大
问题:
看看这个伪代码:
Dog implements IWalk {...}
Cat implements IWalk {...}
Array[IWalk] = [new Dog(),new Cat()]
foreach item in array : item.walk();
恕我直言,事实并非如此。为什么?因为它不对应于上面提到的任何维基类别。
我相信这是纯粹的编码原则,我通过不同的眼镜看一个对象 - 不像上面提到的3个范例那样创建/改变功能
我是对的吗?这是多态的行为吗?
答案 0 :(得分:1)
我认为你走在正确的轨道上。接口本身不是多态的。他们形式化多态性。它们允许您以声明方式定义多态行为,而不是实现。我喜欢将Interfaces视为俱乐部的保镖。他们只是确保每个人都遵循多态规则。
在您的示例中,实际的多态行为与接口本身无关,而是与共享的方法有关。 walk方法适合子类型多态性示例。接口本身只是合同规定子对象走路。
更新:
基于评论:只是为了说清楚 - 通过它实现的不同接口查看对象 - 也是多态行为?
界面本身只是一个合同(你在问题中钉了它)。多态性来自合同上的方法。 &#34;多态类型是一种类型,其操作也可以应用于某些其他类型的值,或类型&#34; (来自维基百科)。接口(合同)是包含服务或使用方法(条款)的协议。因此,每个合同都包含多态行为的术语。
Dog implements IWalk, ITalk, IAnimal
{
//concrete implementation
}
IWalk
{
void walk();
}
ITalk
{
String talk();
}
IAnimal
{
}
我在java上生锈了,所以如果它在语法上不正确,请考虑这个伪代码。
在这种情况下,IAnimal只是一个不包含多态行为的契约。 IWalk和ITalk促进多态性。