OOP中polymorphism的定义疑问:三类解释是否均属其范畴?
多态(Polymorphism)的定义与分类
首先明确:多态的广义定义是“同一接口,不同实现”,它包含你提到的所有类型——动态多态、子类型多态、静态多态,只是不同场景下人们会侧重不同的分支。
1. 静态多态(编译时多态)
指编译器在编译阶段就确定要执行的方法,最典型的就是方法重载:方法名相同,但参数列表(类型、数量、顺序)不同。
示例:
void Add(int a, int b) { /* 整数相加逻辑 */ } void Add(double a, double b) { /* 浮点数相加逻辑 */ }
调用Add(1,2)和Add(1.5,2.5)时,编译器会直接匹配对应的方法,运行时无需额外判断。
2. 子类型多态(代入多态)
这是面向对象中最基础的多态形式之一,核心是子类对象可以替代父类对象使用,遵循里氏替换原则。
示例:
Animal[] animals = new Animal[] { new Dog(), new Cat() };
这里Dog和Cat都是Animal的子类,可以直接放入Animal类型的数组,后续操作中可以统一以Animal的接口处理不同子类实例。
3. 动态多态(运行时多态)
基于子类型多态,通过**方法重写(Override)**实现,程序在运行时才确定要执行的具体方法。
示例:
// 父类定义 class Animal { public virtual void MakeSound() {} } // 子类重写 class Dog : Animal { public override void MakeSound() { Console.WriteLine("Woof!"); } } class Cat : Animal { public override void MakeSound() { Console.WriteLine("Miau!"); } } // 调用时 Animal dog = new Dog(); Animal cat = new Cat(); dog.MakeSound(); // 运行时输出"Woof!" cat.MakeSound(); // 运行时输出"Miau!"
此时变量的编译类型是Animal,但运行时实际类型是Dog/Cat,程序会根据实际类型调用对应的重写方法。
为什么会有不同解释?
不同资料的侧重不同:
- 部分入门教程会先强调动态多态,因为它是OOP中最直观的“多态表现”;
- 有些严谨的编程理论会把子类型多态作为多态的核心,而动态多态是它的运行时体现;
- 静态多态则常被归类为“广义多态”,因为它不依赖继承,只是复用方法名的编译期特性。
总结:这三种都是多态的范畴,只是从不同维度(编译/运行、继承关系)划分的类型,没有“谁对谁错”,关键看语境。
内容的提问来源于stack exchange,提问作者Ado
相关产品推荐
相关产品推荐

