将自己读入 Lisp,目前在此页面 ( http://landoflisp.com ) 上,我在单击链接CLOS GUILD时显示的页面的倒数第二段中找到了以下语句:
关于该示例需要注意的重要一点是,为了确定在给定情况下调用哪个 mix 方法,CLOS 需要考虑传入该方法的两个对象。它根据多个对象的类型分派到方法的特定实现。这是传统面向对象语言(如 Java 或 C++)中不具备的功能。
这是示例 Lisp 代码:
(defclass color () ())
(defclass red (color) ())
(defclass blue (color) ())
(defclass yellow (color) ())
(defmethod mix ((c1 color) (c2 color))
"I don't know what color that makes")
(defmethod mix ((c1 blue) (c2 yellow))
"you made green!")
(defmethod mix ((c1 yellow) (c2 red))
"you made orange!")
不,我认为最后一句话是错误的。实际上,我可以使用以下 Java 代码做到这一点:
public class Main {
public static void main(String[] args) {
mix(new Red(), new Blue());
mix(new Yellow(), new Red());
}
public static void mix(Color c1, Color c2) {
System.out.println("I don't know what color that makes");
}
public static void mix(Blue c1, Yellow c2) {
System.out.println("you made green!");
}
public static void mix(Yellow c1, Red c2) {
System.out.println("you made orange!");
}
}
class Color {}
class Red extends Color {}
class Blue extends Color {}
class Yellow extends Color {}
当我运行它时,它给了我相同的输出:
I don't know what color that makes
you made orange!
所以我的问题是:该页面上的这句话实际上是错误的吗?在 Java / C++ 中可能吗?如果是这样,也许在旧版本的 Java 中是不可能的?(虽然我非常怀疑,因为这本书只有 5 年的历史)如果不是这样,我在我的例子中忘记考虑什么?