多态性和接口 - 澄清?

时间:2014-08-06 14:56:56

标签: java c# design-patterns interface polymorphism

(迂腐的问题)

根据wikipedia,有3种类型的多态性:

  • Ad hoc多态
  

指的是可以应用于参数的多态函数   不同的类型,但根据类型的不同而表现不同   它们应用的论据

换句话说:重载:

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();
  • 这是多态行为(在每个不同的对象上调用walk())?

恕我直言,事实并非如此。为什么?因为它不对应于上面提到的任何维基类别。

我相信这是纯粹的编码原则,我通过不同的眼镜看一个对象 - 不像上面提到的3个范例那样创建/改变功能

我是对的吗?这是多态的行为吗?

1 个答案:

答案 0 :(得分:1)

我认为你走在正确的轨道上。接口本身不是多态的。他们形式化多态性。它们允许您以声明方式定义多态行为,而不是实现。我喜欢将Interfaces视为俱乐部的保镖。他们只是确保每个人都遵循多态规则。

在您的示例中,实际的多态行为与接口本身无关,而是与共享的方法有关。 walk方法适合子类型多态性示例。接口本身只是合同规定子对象走路。

更新:

基于评论:只是为了说清楚 - 通过它实现的不同接口查看对象 - 也是多态行为?

界面本身只是一个合同(你在问题中钉了它)。多态性来自合同上的方法。 &#34;多态类型是一种类型,其操作也可以应用于某些其他类型的值,或类型&#34; (来自维基百科)。接口(合同)是包含服务或使用方法(条款)的协议。因此,每个合同都包含多态行为的术语。

Dog implements IWalk, ITalk, IAnimal
{
    //concrete implementation
}

IWalk 
{
    void walk();
}

ITalk
{
    String talk();
}

IAnimal
{

}

我在java上生锈了,所以如果它在语法上不正确,请考虑这个伪代码。

在这种情况下,IAnimal只是一个不包含多态行为的契约。 IWalk和ITalk促进多态性。