为什么多态性依赖于继承?代码示例?
答案 0 :(得分:11)
多态性不本身依赖于继承。
多态性是一个相当抽象的概念,即为不同类型的值提供统一的接口。
在Java或C#等常见的面向对象语言中,这些接口是通过类继承提供的,但这是多态性的一种可能实现,而不是一般的多态性概念。
Duck类型,结构类型,C ++样式模板或类型类都提供了多态性的其他实现。
只需看到所有这些多态代码,以便为鸭子提供接口......
interface Duck { void quak(); }
void DoQuak(Duck d) { d.quak(); }
def DoQuak(d):
d.quak();
Templates (Static duck-tying) (C++):
template <typename T>
void DoQuak(const T& d) { d.quak(); }
def DoQuak(d : { def quak() : Unit }) { d.quak() }
class Quakable a where
quak :: a -> IO ()
doQuak d = quak d
答案 1 :(得分:1)
答案 2 :(得分:0)
提供与您匹配的接口 以使用继承。
通过使用合同(如子类化具有抽象方法的基类(您 为子类提供实现)或实现一个接口来确保接口匹配并提供保证更容易共享接口。
接口不包含任何代码,它们就像他们在锡上所说的那样 - 某个界面的蓝图。基类可以包含一些实现,但是必须必须抽象/子类才能使用。
然后,您可以应用类型提示来检查公共接口或基类(Observer):
public function register(Observer observer) {
observers.push(observer);
}
或检查接口是否已实施:
if (class instanceof MyInterface) {
// call a method that exists in your interface
class.myMethod();
}
或您的对象扩展了具有某些抽象方法的基类:
if (class instanceof MyBaseClass) {
class.guaranteedToExist();
}