多态性和接口——澄清

本文关键字:澄清 接口 多态性 | 更新日期: 2023-09-27 18:16:36

(迂腐的问题(

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

  • 特设多态性

引用可应用于的参数的多态函数不同的类型,但根据应用的论点

换句话说:过载:

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(((吗

IMHO不是。为什么?因为它与上面提到的任何wiki类别都不对应。

我相信这是纯粹的编码原理,我用不同的眼镜看一个物体,而不是像上面提到的3种范式那样创建/改变功能

我说得对吗?这种行为是多态的还是不多态的?

多态性和接口——澄清

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

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

更新:

基于评论:只是为了明确一点——通过它实现的不同接口查看对象——也是多态行为吗?

接口本身只是一个契约(您在问题中明确了这一点(。多态性来自于合同中的方法。"多态类型是一种类型,其操作也可以应用于其他类型的值"(来自维基百科(。接口(合同(是包含服务或使用方法(条款(的协议。因此,每个合同都包含多态行为的条款。

Dog implements IWalk, ITalk, IAnimal
{
    //concrete implementation
}
IWalk 
{
    void walk();
}
ITalk
{
    String talk();
}
IAnimal
{
}

我对java很生疏,所以如果语法不正确,请考虑这个伪代码。

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