【问题标题】:What's the difference between a method and a function?方法和函数有什么区别?
【发布时间】:2010-09-14 09:53:34
【问题描述】:

有人可以简单解释一下 OOP 上下文中的方法函数吗?

【问题讨论】:

  • 当属性的值是函数时,我们称其为方法
  • 方法的反义词是什么?那是我的问题。 “功能”是父概念。方法是一种函数。不是方法但可以直接通过名称调用的函数类型的名称是什么?
  • r 中看到另一种概述方法和函数之间差异的解释会很有趣。这很有趣,因为方法通常会contain a function。如果方法是依赖于对象的函数,那么对对象类if(class(object)) { ... } else {stop()} 的函数检查在概念上就等同于方法?
  • 正确的术语确实取决于语言,因此在不同的上下文中它可能意味着略有不同的东西。即便如此,因为使用一种语言而不是另一种语言的程序员更习惯于某些术语。程序员也会受到同事对术语的使用(无论正确与否)的影响。这些术语经常互换使用。例如,请参阅下面的一些 cmets。

标签: oop language-agnostic terminology


【解决方案1】:

方法和函数的区别

来自阅读 Microsoft 上的 this doc

包含可执行代码的成员统称为类的函数成员。上一节描述了方法,它们是主要的函数成员。本节介绍 C# 支持的其他类型的函数成员:构造函数、属性、索引器、事件、运算符和终结器。

所以方法是函数的子集。每个方法都是函数,但不是每个函数都是方法,例如,constructor 不能说是方法,但它是函数。

【讨论】:

  • 属性、索引器和事件不是函数。 getter、setter(用于属性和索引器)、adders 和 remover(用于事件)是函数。函数成员是与一个或多个函数相关联的成员,但不一定是函数。
【解决方案2】:

方法和函数之间有明显的区别:

函数是一段独立的代码,你可以在任何地方调用它,只要用给定的参数提到它的名字,就像在大多数过程语言中一样,例如 C++ 和 python。而

方法 专门与一个对象相关联,这意味着您只能通过在它之前用点(.)表示法提及它的对象来调用方法,就像在专门的纯面向对象语言(如 C# 和 java)中一样。

【讨论】:

  • 只有一点我不同意:C# 和 Java 不是纯面向对象的语言。您可以用这些语言编写相当实用的代码。 :)
【解决方案3】:

一般答案是:

method 具有对象上下文(this,或类实例引用),

function 没有上下文(null、全局或静态)。

但问题的答案取决于您使用的语言术语。

  1. 在 JavaScript (ES 6) 中,您可以随意使用 to customising function context (this),这通常必须链接到 (this) 对象实例上下文。

  2. 在 Java 世界中,您总是会听到 "only OOP classes/objects, no functions",但如果您仔细观察 Java 中的 static methods,它们实际上是在全局/空上下文(或类的上下文,没有实例化)中,所以只是没有对象的函数. Java 老师可以告诉你functions were rudiment of C in C++ and dropped in Java,但他们告诉你这是为了简化历史并避免新手提出不必要的问题。如果你在 Java 7 之后的版本中看到,你会发现很多纯函数编程的元素(甚至不是来自 C,but from older 1988Lisp)for simplifying parallel computing, and it is not OOP classes style

  3. 在 C++ 和 D 世界中,事情变得更强大,而您将 functionsobjects with methods and fields 分开。但在实践中,您会再次看到函数 without this 和方法 whith this(带有对象上下文)。

  4. 在 FreePascal/Lazarus 和 Borland Pascal/Delphi 中,函数和objects(变量和fields)的分离项通常类似于 C++。

  5. Objective-C 来自 C 世界,所以你必须通过方法插件将 C 函数和 Objective-C 对象分开。

  6. C# 与 Java 非常相似,但具有许多 C++ 优势。

【讨论】:

    【解决方案4】:

    method 是任何对象或类的成员。 function 是独立的。

    但对于 Javascript,functionmethod 是可以互换的。

    【讨论】:

      【解决方案5】:

      简而言之:非静态(“instance”)方法采用隐藏指针指向“this”(作为它们的第一个参数),这是您调用该方法的对象。

      这是与常规独立函数的唯一区别,尽管有动态调度。

      如果您有兴趣,请阅读下面的详细信息。

      我会尽量简短,并以 C++ 为例,尽管我所说的几乎可以应用于所有语言。

      • 对于您的 CPU,函数和方法都只是一段代码。 期间。
      • 因此,当调用函数/方法时,它们可以采用 参数

      好的,我说没有实际区别。让我们深入挖掘一下:

      • 有两种方法:静态和非静态
      • 静态方法类似于常规函数,但在类中声明,其作用类似于命名空间
      • 非静态(“实例”)方法采用一个指向“this”的隐藏指针。这是与常规独立函数的唯一区别。

      抛开动态调度不谈,就是这么简单:

      class User {
          public string name; // I made it public intentionally
      
          // Each instance method takes a hidden reference to "this"
          public void printName(/*User & this*/) {
              cout << this.name << endl;
          }
      };
      

      等价于

      public getName(User & user) {
          // No syntactic sugar, passing a reference explicitly
          cout << user.name << endl;
      }
      

      所以,本质上,user-&gt;printName() 只是getName(user) 的语法糖。

      如果您不使用动态调度,仅此而已。如果它被使用,那么它会涉及更多,但编译器仍会发出看起来像以this作为第一个参数的函数。

      【讨论】:

      • 很好的解释。您可以在示例代码旁边的某处添加 printName() 作为方法,而 getName() 作为函数吗?
      【解决方案6】:

      它们通常可以互换,但方法通常指类内的子例程,函数通常指类外的子例程。 例如,在 Ruby 中:

      # function
      def putSqr(a)
         puts a ** 2
      end
      
      
      class Math2
         # method
         def putSqr(a)
            puts a ** 2
         end
      end
      
      

      在 Java 中,所有东西(除了 package 和 import 语句)都必须在类中,人们几乎总是将它们称为“方法”。

      【讨论】:

        【解决方案7】:

        函数和方法看起来非常相似。它们也有输入和返回输出。区别在于方法在类内,而函数在类外

        【讨论】:

          【解决方案8】:

          在 C# 术语中,函数和方法是有区别的。术语函数成员不仅包括方法,还包括其他非数据成员,例如索引器、运算符、构造函数、析构函数和属性——所有包含可执行代码的成员。

          reference => Professional C# and .NET 2021 Edition - 由 Christina Nagel 编写

          【讨论】:

            【解决方案9】:

            方法和函数有什么区别?

            Python的官方文档是这样定义的(感谢@Kelly Bundy here!):

            function

            返回一些值给调用者的一系列语句。它也可以传递零个或多个arguments,可用于执行主体。另请参阅 parametermethodFunction definitions 部分

            method

            在类体内定义的函数。如果作为该类实例的属性调用,该方法将获取实例对象作为其第一个argument(通常称为self)。请参阅functionnested scope


            正方形是长方形,但并非所有长方形都是正方形。我解释世界的方式是,方法是函数,但并非所有函数都是方法。一个方法的独特之处在于它是一个特殊类型的函数,它也与一个类相关联并且可以访问类成员变量。

            另见:

            1. [我的回答]hasattr is called a method, but it looks like a function

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-30
              • 2012-01-06
              • 2019-10-08
              • 1970-01-01
              • 1970-01-01
              • 2018-12-26
              • 2015-08-11
              相关资源
              最近更新 更多