多态性涉及继承

时间:2010-03-11 07:21:05

标签: polymorphism

为什么多态性依赖于继承?代码示例?

3 个答案:

答案 0 :(得分:11)

多态性本身依赖于继承。

多态性是一个相当抽象的概念,即为不同类型的提供统一的接口

在Java或C#等常见的面向对象语言中,这些接口是通过类继承提供的,但这是多态性的一种可能实现,而不是一般的多态性概念。

Duck类型,结构类型,C ++样式模板或类型类都提供了多态性的其他实现。

只需看到所有这些多态代码,以便为鸭子提供接口......

Inheritance/Interfaces (C#):

interface Duck { void quak(); }

void DoQuak(Duck d) { d.quak(); }

Dynamic Duck-typing (Python):

def DoQuak(d):
    d.quak();

Templates (Static duck-tying) (C++):

template <typename T>
void DoQuak(const T& d) { d.quak(); }

Structural types (Scala):

def DoQuak(d : { def quak() : Unit }) { d.quak() }

Type classes (Haskell):

class Quakable a where
    quak :: a -> IO ()

doQuak d = quak d

答案 1 :(得分:1)

多态性是指对象根据其类型改变行为(表现不同)的能力。

覆盖是实现多态的手段。覆盖函数“替换”从基类继承的函数。

SO的这一部分有discussion/examples,您可能会对此感兴趣。

答案 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();
}