消息、方法与多态

顺便的说一句,这是一个基于经典的 Smalltalk 示例程序的例子,说明了如何将相同的“消息”(例如 talk)发送给不同的对象(例如 cats 和 dogs),并且每个不同的对象会对相同的消息使用它们自己特有的方法(这里是 talk 方法)产生不同的响应。这种不同的类拥有相同的方法的能力有一个面向对象的名字“多态”——这个词可以不用记住。

当你运行一个程序,例如 6dogs.rb ,它的代码是顺序执行的。但是,直到类的实例(即对象)被后面的代码创建类的代码本身不会被执行。你会发现,我经常将类定义与程序运行时就会被执行的独立自由地代码混合着写。这可能不是你想写一个应用程序的主要方式,但这仅仅是尝试,而且它非常方便。

什么是自由独立的代码?

如果 Ruby 真的是一个面向对象的语言,你可能会因为我们可以写“自由浮动”的方法而感到奇怪。事实上被证明的是,当你运行一个程序时,Ruby 会创建一个 main 对象并且任何出现在其内部的代码不是自由浮动的,实际上是在 main 对象内部运行。你可以很容易的验证这一点,创建一个新的源文件,添加这些代码然后运行它来查看输出信息:

puts self puts self.class

我的程序有一个明显的缺陷就是 Cat 和 Dog 类是高度重复的。也许更有意义的做法是,创建一个包含 get_nameset_name 方法的 Animal 类,并且它有两个仅仅包含特定行为——woofing 或 miaowing——的后代类 Cat 和 Dog。我们将在下一章中找到如何做到这一点。