我是否可以说构造函数是方法的一种特殊情况?
你可以这么说,正如你可以说人类是动物中的一个特例一样,但在大多数情况下提到动物意味着非人类动物,而提到方法则意味着非构造方法。
Class#allocate
,它仅分配一个空对象并设置该对象的类指针。没有更多的操作。由于这样的空对象显然无法使用,因此需要初始化。按照惯例,这个初始化是通过#initialize
执行的。为了方便起见,因为总是记得同时分配和初始化很麻烦(任何Objective-C开发人员可能都可以证明),有一个叫做Class#new
的帮助方法,看起来像这样:class Class
def new(*args, &block)
obj = allocate
obj.initialize(*args, &block)
return obj
end
end
foo = Foo.allocate
foo.initialize(bar)
foo = Foo.new(bar)
Class#allocate
明显需要能够设置类指针并分配内存,而这在Ruby中是不可能的。因此,这个方法必须以某种方式来自于系统外部,比如在MRI中意味着它是用C而不是Ruby编写的。但这只涉及到实现问题。没有特殊的调度规则,也没有特殊的覆盖规则。它就像任何其他方法一样,可以随时随地调用super
,并返回它想要的任何东西。我认为构造函数太特殊了,不应该被称为方法。
啰嗦啰嗦啰嗦。
不同的语言可能存在差异,但我不认为我会把构造函数称为“特殊方法”。
“特殊”是这里的关键词。称构造函数为特殊方法并没有任何问题,但是“特殊”所暗示的含义可能因语言而异。
在大多数情况下,“特殊”意味着它们不能返回值或在创建新对象之前作为方法调用。但总有例外:一个典型的例子是JavaScript,其中构造函数与普通函数没有区别,它可以返回自己的值,并且可以作为构造函数或简单函数调用。
@Tom Brito,我个人同意您的观点,构造函数是一种方法的特殊情况。
另外,请参见以下内容:
类中的构造函数是在创建对象时调用的一种特殊类型的子例程。
... 构造函数类似于实例方法,但它与方法不同之处在于它从不具有显式返回类型...
来源: 维基百科
此外,您还可以阅读我的评论(woot4moo、phunehehe)。
至少在vb.net中,构造函数可以具有非标准的控制流程。如果构造函数的第一条语句是对New的调用(无论是相同类型还是基类型),则事件序列将是:(1)执行调用;(2)初始化与类型相关联的所有字段;(3)完成处理其余的构造函数。没有任何普通方法具有这种控制流程。这种控制流程使得可能做到像将构造函数参数传递给派生类型的字段初始化程序那样的事情,如果基类型编写允许这样做。