【问题标题】:Can I say a Constructor is a Method? [closed]我可以说构造函数是方法吗? [关闭]
【发布时间】:2011-04-08 11:15:59
【问题描述】:

我想知道我是否可以说构造函数方法的特例?

【问题讨论】:

  • 有点太模糊了。定义方法。
  • @dirk,你的评论有点含糊。定义模糊。 (说真的,这个问题定义明确)。
  • +1 to pavel :) 如果问题含糊不清,下面不会有明确的答案。
  • IME,术语方法有多种定义。
  • @Gan:接受的答案“你可以说任何事”就像说这个问题很模糊(我的意思是绝对没有冒犯 bmargulies)。

标签: oop methods constructor terminology


【解决方案1】:

你可以说任何话。是否有人会不同意您的观点取决于上下文。一些语言社区和标准以这种方式定义事物。

更详细地说,这取决于您所说的“方法”。例如,在 C++ 中,分析创建过程的一种方法是说它包括对 operator new 的调用(可能只是放置),然后是对构造函数 method 的调用。从实现的角度来看,构造函数看起来、行走和嘎嘎就像一个方法。在某些编译器中,您甚至可以显式调用一个。

从更理论的角度来看,有人可能会声称构造函数是一些独特的物种。然而,对于方法、构造函数或紫色独角兽,不存在单一、真实、特权的概念模型。

天哪,这都是主观的。

【讨论】:

  • “你可以说任何话。”但请记住“您所说的任何内容都可以而且将在法庭上被用来对付您。” =)
  • @kemiisto +1 供您发表评论,因为我没有看到所选答案的真正价值 :-) 我认为其他答案将共同呈现为一个非常好的和详尽的答案。跨度>
  • @Ondrej Tucny:我看不出问题本身的价值。
  • @kemiisto 如果您不认为是编程语言的用户,那么您是对的,问这样的问题没有多大意义。但是,如果您学习编程语言设计,这是一个涉及很多方面的非常基础的问题。
  • +1 给 Ondrej,我同意你的看法(“看不到所选答案的真正价值”:)
【解决方案2】:

我觉得构造函数太特殊了,不能叫方法

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

哈哈哈哈哈哈

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

【讨论】:

  • 你不能在它存在之前修改它
  • 嗯,“初始化”这个词更好
  • 构造函数不返回任何东西。方法也可以声明为不返回任何内容(C++ 中为 void)。
  • void 是返回类型,而构造函数没有返回类型
  • @Woot4Moo:你知道有几种编程语言(VB.NET,Pascal,Fortran,Ada,...)可以区分“函数”或“函数子程序”,它们提供调用程序的显式返回值,以及“子程序”或“程序”,哪些没有?不返回任何内容的子例程在此类语言中非常常见。
【解决方案3】:

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

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

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

【讨论】:

  • 当它没有返回类型时,你怎么能说它通常是一个方法呢?
  • 提供一个方法是一组命名的可执行代码(在非常简单的意义上),为什么一个方法应该有一个“返回类型”?
  • 从技术上讲,这很大程度上取决于上下文。例如,在 Java 中,术语“构造函数”和“方法”之间存在明显区别(不了解 C#)。另外,这里en.wikipedia.org/wiki/Constructor_(object-oriented_programming)
  • @Woot4Moo 用什么语言?我认为在这里不那么绝对主义的主张是合适的。例如,在 CLI EMCA 335 中的第 8.6.1.5 节方法签名中提到“返回类型”,即“方法签名由……结果值的类型签名组成,如果生成了一个。”
  • @Woor4Moo 我不是在争论 void 是一种类型。但是您显然没有理解重点,至少在 .NET 世界中的情况是这样,因为在 .NET 中,构造函数方法根据定义。请参阅上面的更新答案。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    在具有构造函数的语言中,您通常可以将构造函数视为工厂方法的特例。 (注意:我不是指 GoF 工厂方法软件设计模式,我只是在谈论创建新实例的 any 类方法。)通常,这种“特殊外壳”通常采用以下形式恼人的限制(例如,在 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,只要它想要并且可以返回它想要的东西。

    【讨论】:

      【解决方案6】:

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

      另外,见下文:

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

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

      来源: Wikipedia

      另外,您可以阅读我的 cmets 关于其他人的评论(woot4moo,phunehehe)。

      【讨论】:

        【解决方案7】:

        你可以这么说,就像你可以说一个humananimal的一个特例,但是在大多数情况下提到animals 暗示 非人类动物,提及 methods 暗示 非构造方法

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 2015-05-22
            • 2015-02-14
            • 1970-01-01
            • 1970-01-01
            • 2010-10-18
            • 1970-01-01
            • 2011-07-10
            • 2011-04-21
            • 1970-01-01
            相关资源
            最近更新 更多