我正在学习OOP概念,它们实际上没有完善的定义。
我听到了有关多态性的不同看法,无法确定什么是正确的。
大多数人会说这是一种类型理论。这意味着一个函数能够接受具有某些共同点的多种类型的参数。
临时多态性是关于同一函数的不同重载。
参数多态性是通用函数。
子类型多态性是,如果函数接受某个类作为参数,则它也可以接受其子类。 (当然,只有那些不是抽象的而是具体的可以作为参数传递。)
似乎有一个不同的定义。有人说多态性意味着一个函数可以具有不同的实现(变形/形式)。 从这个意义上说... -界面功能, -抽象类的抽象功能, -以及可以被子类型覆盖的虚函数 ...都被认为是多态的。
据我所知,如果在不同的对象上调用相同的函数,则可以将这种多态定义为具有不同的结果。
更令人困惑的是,有人说只有虚函数是多态的,因为它们已经有实现了。
对我来说,我提出多态性的第一种方式似乎完全不同,但是也许它们都符合多态性的定义,只是我无法理解它。
那么编程中的多态是什么?仅仅是类型理论吗?
在这个问题上,我想参考这个问题: https://stackoverflow.com/questions/25163683/polymorphism-and-interfaces-clarification#=
它提出了几乎相同的问题,但我无法真正得出结论。
答案 0 :(得分:0)
是和否
是的,在经典的继承语言中,它是这样工作的。
否,因为在其他语言中,对象上方法的调用可能是动态解决的。 (例如,通过运行时代码在对象列表中作为字段进行搜索,在COM术语中称为聚合)
在类型理论中没有定义该方法存在于对象类型的IOW。至少不是普遍的。该语言甚至可能不会输入。对于静态继承的对象模型,这是正确的。 IOW Typing(子类型/继承,虚拟方法的概念)是具有这种对象模型的语言中多态性的实现。但并非所有语言都可以。
有些具有调度多态性,并且可以添加方法运行时(例如目标C)或完全不存在该方法(例如COM IDispatch)
多态性的经典考验是“鸭子嘎嘎”。如果您有通用的“动物”,并调用“ makesound”的方法,如果您分配了鸭子,则它会“嘎嘎”。因此,您可以在通用对象上调用方法(以旧的OO术语传递消息),并获得分配给它的更专门对象的行为。
什么构成“通用”对象取决于语言。在静态继承的语言中,通用对象必须具有声明的方法,有时带有特殊修饰符(虚拟)以表示可重写性。
在其他语言中,通用对象可以是根对象,运行时将确定它是否具有makesound方法。