所有的动态绑定都是一种多态吗?
Is all dynamic binding a kind of polymorphism?
是不是所有的动态绑定都算多态?具体来说,我说的是 Java。如果不是,请解释这两个术语。
据我所知:不是所有的继承都是多态,但是所有的多态都使用了继承。
首先dynamic binding (or late binding) is an improper term. You are talking about dynamic dispatch这是另一回事。
动态绑定 正在选择在运行时将调用哪个方法的实现,但这在 Java 中不会发生。但是你有动态调度,这是在编译时选择方法的正确多态实现的能力(通常转化为选择最专业的method/function).
但我不会说动态调度就是多态性,我会说要支持多态性你需要一种机制来选择方法的正确实现,这就是动态调度。
继承是一种称为subtyping(或子类型多态)的多态性,所以,与你所说的相反,继承始终是多态性的一种形式,但其他存在多种多态性,想想:
- ad hoc polymorphism(通过重载实现)同一个函数在不同的参数上有不同的含义
- parametric polymorphism(在 Java 中使用泛型实现),其中类型带有类型变量,因此单个类型可以通过将变量绑定到特定类型(或class 种),考虑
List<Integer>
如果方法调用是在运行时决定的——那就是动态多态。如果方法调用在编译时由编译器决定,则称为静态多态性。
示例:
public static void eat (Veg vegetable) {
System.out.println("I am vegetarian");
}
public static void eat(Meat meat) {
System.out.println("I am non-vegetarian");
}
//if your main is this way
public static void main(String args[])
{
Veg v = new Meat();
callEat(v);
}
它打印 "I am vegetarian" 。这是由编译器在运行时决定的。它也被称为方法覆盖。
int add (int a , int b){
return a+b;
}
int add(int a, int b, int c){
return a+b+c;
}
void main (){
add(1,2);
add(1,2,3);
}
此处根据传递的参数选择函数,即使方法的名称和 return 类型相同也是如此。这是在编译时完成的。这就是静态多态。它也被称为方法覆盖。
是不是所有的动态绑定都算多态?具体来说,我说的是 Java。如果不是,请解释这两个术语。
据我所知:不是所有的继承都是多态,但是所有的多态都使用了继承。
首先dynamic binding (or late binding) is an improper term. You are talking about dynamic dispatch这是另一回事。
动态绑定 正在选择在运行时将调用哪个方法的实现,但这在 Java 中不会发生。但是你有动态调度,这是在编译时选择方法的正确多态实现的能力(通常转化为选择最专业的method/function).
但我不会说动态调度就是多态性,我会说要支持多态性你需要一种机制来选择方法的正确实现,这就是动态调度。
继承是一种称为subtyping(或子类型多态)的多态性,所以,与你所说的相反,继承始终是多态性的一种形式,但其他存在多种多态性,想想:
- ad hoc polymorphism(通过重载实现)同一个函数在不同的参数上有不同的含义
- parametric polymorphism(在 Java 中使用泛型实现),其中类型带有类型变量,因此单个类型可以通过将变量绑定到特定类型(或class 种),考虑
List<Integer>
如果方法调用是在运行时决定的——那就是动态多态。如果方法调用在编译时由编译器决定,则称为静态多态性。
示例:
public static void eat (Veg vegetable) {
System.out.println("I am vegetarian");
}
public static void eat(Meat meat) {
System.out.println("I am non-vegetarian");
}
//if your main is this way
public static void main(String args[])
{
Veg v = new Meat();
callEat(v);
}
它打印 "I am vegetarian" 。这是由编译器在运行时决定的。它也被称为方法覆盖。
int add (int a , int b){
return a+b;
}
int add(int a, int b, int c){
return a+b+c;
}
void main (){
add(1,2);
add(1,2,3);
}
此处根据传递的参数选择函数,即使方法的名称和 return 类型相同也是如此。这是在编译时完成的。这就是静态多态。它也被称为方法覆盖。