多态性和接口——澄清
本文关键字:澄清 接口 多态性 | 更新日期: 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促进多态性。