我可以说构造函数是一种方法吗?

时间:2010-09-05 14:53:47

标签: oop methods constructor terminology

我想知道我是否可以说构造函数方法的特殊情况

8 个答案:

答案 0 :(得分:13)

你可以说什么。是否有人会不同意你的观点取决于具体情况。一些语言社区和标准以这种方式定义。

更精细的是,它取决于你用'方法'的含义。例如,在C ++中,分析创建过程的一种方法是说它包含对操作符new(可能只是放置)的调用,然后是对构造函数方法的调用。从实现的角度来看,构造函数像方法一样查看,遍历和嘎嘎叫。在某些编译器中,您甚至可以显式调用一个。

从更理论的角度来看,有人可能会声称构造者是一些独特的物种。但是,没有单一的,真实的,特权的方法,构造函数或紫色独角兽的概念模型。

天哪,这都是主观的。

答案 1 :(得分:12)

你可以这么说,正如你可以说 动物 的一个特例,但在大多数情况下提到< em> animals 暗示非人类动物并提及方法暗示非构造函数方法

答案 2 :(得分:9)

从技术上讲,构造函数通常是方法。它是否真的在很大程度上取决于特定的环境。例如,在.NET中,构造函数是在创建对象后实际调用的方法。但是,也可以创建一个对象而不需要在之后调用构造函数。

更新:关于.NET,或者更准确的公共语言基础结构,ECMA 335,第8.9.6.6节构造函数声明:

  

通过构造函数创建对象类型的新值。构造函数应该是实例方法,通过特殊形式的方法契约定义,它将方法契约定义为特定对象类型的构造函数。

答案 3 :(得分:2)

我认为构造函数太特殊而无法被称为方法

  • 它不会返回任何内容
  • 在初始化对象之前修改对象
  • 它不能自称(想象一下)
blah blah blah

语言之间可能存在差异,但我认为我不会调用构造函数“特殊方法”。

答案 4 :(得分:2)

在具有构造函数的语言中,通常可以将构造函数视为工厂方法的特例。 (注意:我不是指GoF工厂方法软件设计模式,我只是在谈论创建新实例的任何类方法。)通常,这种“特殊外壳”通常采用以下形式:恼人的限制(例如在Java中,你只能在构造函数的开头调用父构造函数),这就是为什么即使在的语言中都有构造函数,你仍然经常最终使用或编写工厂方法

因此,如果构造函数基本上是带有限制的工厂方法,那么实际上没有必要同时使用它们,因此许多语言只是摆脱了构造函数。示例包括Objective-C,Ruby,Smalltalk,Self,Newspeak,ECMAScript / JavaScript,Io,Ioke,Seph等等。

在Ruby中,与构造函数最接近的是方法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,无论何时何地,都可以返回它想要的东西。

答案 5 :(得分:0)

“特别”是这里的神奇词汇。将构造函数称为特殊方法绝对没有错,但“特殊”含义可能因语言而异。

在大多数情况下,“特殊”意味着它们不能返回值或在不创建新对象的情况下作为方法调用。但总有例外:一个主要的例子是JavaScript,其中构造函数与普通函数没有区别,可以返回自己的值,可以调用构造函数或简单函数。

答案 6 :(得分:0)

@Tom Brito,我个人同意你的看法,构造函数是方法的特殊情况

另见下文:

  

类中的构造函数是在创建对象时调用的特殊类型的子例程。

     

...构造函数类似于实例方法,但它与方法的不同之处在于它从不具有显式的返回类型......

来源: Wikipedia

另外,你可以阅读我对别人评论的评论(woot4moo,phunehehe)。

答案 7 :(得分:0)

至少在vb.net中,构造函数可以具有非标准的控制流。如果构造函数的第一个语句是对New(相同类型或基类型)的调用,则事件序列将是:(1)执行调用; (2)初始化与该类型相关的所有字段; (3)完成处理构造函数的其余部分。没有正常的方法有这种控制流程。如果编写基类型以允许这样的控制流,则可以执行诸如将构造函数参数传递给派生类型的字段初始值设定项之类的操作。