是否有一种语言允许动态绑定参数?
Is there a language allowing dynamic binding for arguments?
是否有一种语言允许超类型 A 定义方法 useFoo (Foo foo) 例如 B,派生自 A 定义方法 useFoo(Bar bar),(Bar 派生自 Foo),当使用 B 作为带有 Foo 的 A 是 Bar,它将 运行 最专业的 useFoo 版本?
Java 示例(不幸的是不工作):
public class Foo {
}
public class Bar extends Foo {
}
public class A {
void useFoo (Foo foo) {
System.out.println("A");
}
}
public class B extends A {
void useFoo (Bar bar) {
System.out.println("B");
}
}
public static void main(String[] args) {
A b = new B();
b.useFoo(new Bar()); // actually returns "A", is there one returning "B" ?
}
我知道有一种方法可以通过 "few" 行(例如使用访问者)实现这一点,但我想知道是否有任何(编译)语言允许它。
我承认我想知道这是否可能,相反我不会感到惊讶,是什么阻止了它?
这个概念有更好的名字吗?
编辑:在java中,它被命名为Contravariance。谢谢@Kevinrob
您的问题与以下概念有关:
- Covariance:参数可以在 subclasses 中重新定义为原始参数 class 的子class。例如,此约定用于 Eiffel。众所周知,该方法会导致类型安全问题、CAT 调用(CAT = 更改可用性或类型),需要以特殊方式解决这些问题以保持类型系统的稳健性。协变性的有力论据是它与合同很好地结合(例如,与合同设计)。
- Multiple dispatch:方法调用不仅依赖于调用目标的类型,还依赖于参数的类型。该页面列出了支持此机制的几种语言。多重分派是一种处理协变和逆变的方法。但是,在设计依赖机制的方法集时必须小心,以避免在 运行 时间执行意外方法。
- Generic programming:参数类型不由供应商固定,可以由客户固定。该机制是类型安全的并且没有前两个问题,但它需要客户端显式指定实际的泛型参数,如果此类参数太多,类型声明可能会变得笨拙。现在有很多语言支持它。
是否有一种语言允许超类型 A 定义方法 useFoo (Foo foo) 例如 B,派生自 A 定义方法 useFoo(Bar bar),(Bar 派生自 Foo),当使用 B 作为带有 Foo 的 A 是 Bar,它将 运行 最专业的 useFoo 版本?
Java 示例(不幸的是不工作):
public class Foo {
}
public class Bar extends Foo {
}
public class A {
void useFoo (Foo foo) {
System.out.println("A");
}
}
public class B extends A {
void useFoo (Bar bar) {
System.out.println("B");
}
}
public static void main(String[] args) {
A b = new B();
b.useFoo(new Bar()); // actually returns "A", is there one returning "B" ?
}
我知道有一种方法可以通过 "few" 行(例如使用访问者)实现这一点,但我想知道是否有任何(编译)语言允许它。
我承认我想知道这是否可能,相反我不会感到惊讶,是什么阻止了它?
这个概念有更好的名字吗?
编辑:在java中,它被命名为Contravariance。谢谢@Kevinrob
您的问题与以下概念有关:
- Covariance:参数可以在 subclasses 中重新定义为原始参数 class 的子class。例如,此约定用于 Eiffel。众所周知,该方法会导致类型安全问题、CAT 调用(CAT = 更改可用性或类型),需要以特殊方式解决这些问题以保持类型系统的稳健性。协变性的有力论据是它与合同很好地结合(例如,与合同设计)。
- Multiple dispatch:方法调用不仅依赖于调用目标的类型,还依赖于参数的类型。该页面列出了支持此机制的几种语言。多重分派是一种处理协变和逆变的方法。但是,在设计依赖机制的方法集时必须小心,以避免在 运行 时间执行意外方法。
- Generic programming:参数类型不由供应商固定,可以由客户固定。该机制是类型安全的并且没有前两个问题,但它需要客户端显式指定实际的泛型参数,如果此类参数太多,类型声明可能会变得笨拙。现在有很多语言支持它。