public class A
{
public static void X() { }
public void X(string a) { }
}
public class B :A
{
public void X(string a, string b) { }
}
多态有两种实现方式: 覆写, 重载.
重载不是面向对象技术. 泛型也不是.
没有晚绑定, 就没有多态.
对于同一个名称的方法/函数:
覆写, 使同一类型, 有不同的行为. 因为存在子类型.
重载, 使不同类型, 有不同行为.
泛型, 使不同类型, 有同样的行为.
重载实际不能实现多态, 它是早绑定的. 调用方法之前, 已经清楚知道类型了, 清楚知道方法签名. 等同于名称不同的方法. 它对付不了 if 语句.
覆写一次只能对付一个数据, 即 this. 对于一个以上数据, 只能把 if 藏在方法之中, 再分发给重载方法, 从外面看貌似继续多态了.
泛型, 早绑定, 实现晚绑定功能. 所以它也不能多态. Lisp 中的宏能够实现泛型.
伪泛型, 把不同类型数据用相同接口封装, 或者说用不同派生类封装, 统一基类, 能实现泛型功能, 只不过代码要多一些. 对于基础值类型, 则只有用Object+造型了.
泛函, 对比面向对象, 闭包相当于一个对象, 只有一个公共方法, 其余所有成员私有, 有不受数量限制的私有的属性和方法. 类型, 只有一个相当于Object 的类型. 显然是多态的, 不同的闭包覆写了唯一的公共方法. 它是晚绑定.
面向对象语言只需再多那么一点点语法糖, 也能实现函数的第一公民身份, 这样想来, 以后对泛函也不用那么执着.
像 Lisp 的那种宏还真是好东西.