gpt4 book ai didi

java - 我们可以在不强制类实现接口(interface)的情况下拥有多态性吗?

转载 作者:行者123 更新时间:2023-12-01 12:38:49 25 4
gpt4 key购买 nike

假设我们有一个 interface调用Animal有两种方法称为 move()makeSound() .
这意味着我们可以发送消息 move()makeSound()Animal 类型的变量上, 我们只能分配实现 Animal 的类的对象到 Animal 类型的变量.
现在我的问题是,Java 是否可以不强制想要使用多态性的类来实现 interface ?
例如,为什么 Java 没有像下面这样实现多态性:
我们只需创建一个 Animal interface然后我们就可以将我们想要的任何对象分配给 Animal 类型的变量只要那个对象有方法move()makeSound() , 例如:

Animal animal1;

/* The Java compiler will check if Dog have the methods move() and makeSound(), if yes then
compile, if no then show a compilation error */
animal1 = new Dog();

animal1.move();
animal1.makeSound();
注意:我以 Java 为例,但我泛指所有 OOP 语言。另外,我知道我们可以使用从父类(super class)继承的子类来实现多态性(但这与使用 interface 的想法基本相同)。

最佳答案

有许多不同的方法来获得多态性。您最熟悉的是包含多态性(也称为子类型多态性),程序员通过某种扩展子句明确地说“X is-a Y”。你可以在 Java 和 C# 中看到这一点;两者都让您可以选择为表示和 API(extends)或仅用于 API(implements)设置这样的 is-a。
还有参数多态性,您可能已经将其视为泛型:定义类型族Foo<T>与一个单一的声明。您可以在 Java/C#/Scala(泛型)、C++(模板)、Haskell(类型类)等中看到这一点。
有些语言有“鸭子类型”,他们愿意在结构上确定类型,而不是查看声明(“X is-a Y”)。如果契约(Contract)说“要成为 Iterator ,你必须有 hasNext()next() 方法”,那么根据这种解释,任何提供这两种方法的类都是 Iterator ,不管它是否这样说。这与您描述的情况相符;这是对 Java 设计者开放的选择。
具有模式匹配或运行时反射的语言可以表现出一种特殊的多态性(也称为数据驱动的多态性),您可以在其中定义不相关类型的多态行为,例如:

int length(Object o) {
return switch (o) {
case String s -> s.length();
case Object[] os -> os.length;
case Collection c -> c.size();
...
};
}
在这里, length在一组特殊的类型上是多态的。
也可以有一个“X is-a Y”的显式声明而不把它放在 X 的声明中。Haskell 的类型类这样做,而不是 X 声明“I'm a Y”,有一个单独的声明的 instance明确表示“X 是 Y(如果编译器不明显,这里是如何将 X 功能映射到 Y 功能。)”这样的实例通常被称为见证;它是 X 的 Y-hood 的见证人。Clojure 的协议(protocol)类似,Scala 的隐式参数扮演着类似的角色(“找我见证 CanCopyFrom[A,B] ,否则在编译时失败”)。
所有这一切的重点是有很多方法可以获得多态性,有些语言选择他们最喜欢的,有些支持不止一种,等等。
如果你的问题是为什么 Java 选择显式子类型而不是鸭子类型,答案是相当清楚的:Java 是一种设计用于使用组件构建大型系统(如 C++)的语言,并且组件需要对其边界进行强检查。因为双方碰巧有同名的方法,所以松散的匹配是建立程序员意图的一种比显式声明更不可靠的方法。此外,Java 语言的核心设计原则之一是“阅读代码比编写代码更重要”。声明“实现迭代器”可能需要做更多的工作(但不会更多),但它让读者更清楚您的设计意图是什么。
因此,这是我们现在可能称之为“仪式”的权衡,以获得更高的可靠性和更清晰地捕捉设计意图。

关于java - 我们可以在不强制类实现接口(interface)的情况下拥有多态性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62907538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com