题 方法和函数之间有什么区别?


有人可以提供一个简单的解释 方法 与 功能 在OOP环境中?


1448
2017-09-30 23:45


起源


也可以看看 子程序与功能, 功能与程序, 协同程序。 - gerrit
当属性的值是函数时,我们称之为方法 - coder
方法的反义词是什么?这是我的问题。 “功能”是父母的概念。方法是一种功能。一种函数的名称是什么,它不是一个方法,但可以直接通过名称调用? - Alexander Mills
看到另外一个解释方法和功能之间差异的解释会很有趣 [R。通常方法很有意思 包含一个功能。如果method是一个依赖于对象的函数,那么函数检查对象类 if(class(object)) { ... } else {stop()} 在概念上等同于方法? - Konrad


答案:


一个 功能 是一段按名称调用的代码。它可以传递数据以进行操作(即参数),并且可以可选地返回数据(返回值)。传递给函数的所有数据都是显式传递的。

一个 方法 是一段代码,由与对象关联的名称调用。在大多数方面,除了两个主要区别外,它与功能相同:

  1. 方法隐式传递调用它的对象。
  2. 方法能够对包含在类中的数据进行操作(记住对象是类的实例 - 类是定义,对象是该数据的实例)。

(这是一个简化的解释,忽略了问题 范围 等等。)


1505
2017-10-01 00:00



对于1),您还应该添加C ++中的方法 会员 功能。因此,此上下文中的函数和方法之间的差异类似于C ++中函数和成员函数之间的差异。此外,像Java这样的语言只有方法。在这种情况下,函数将类似于静态方法,并且方法具有相同的含义。对于2),您应该添加一个方法能够对其进行操作 私人的 实例(成员)数据声明为类的一部分。任何代码都可以访问公共实例数据。 - Raffi Khatchadourian
函数是一种数学结构。我会说所有方法都是函数,但并非所有函数都是方法 - Tyler Gillies
从功能编程背景来看,我觉得功能和方法之间存在着深刻的区别。主要方法有副作用,功能应该是纯粹的,从而提供相当好的参考透明性 - HHC
@TylerGillies和HHC,我同意如果“功能”和“方法”意味着你想要的东西可能会很好,但你的定义并没有反映这些术语的一些非常常见的用法。 - Paul Draper
通过这个定义,静态方法实际上不会被认为是一种方法,因为它与特定实例没有任何关系? - Carcigenicate


方法是在一个对象上。
函数独立于对象。

对于Java,只有方法。
对于C,只有函数。

对于C ++,它取决于你是否在课堂上。


872
2017-09-30 23:51



是时候添加C#了。 - Rosdi Kasim
@RosdiKasim对于C#,只有方法。 (因为即使静态方法也需要与对象相关联) - Lynn Crumbling
一个类中的静态方法怎么样?那些将独立于一个对象(在java中)。那不是一个功能吗? - Squeazer
@Squeazer最近有一个问题 stackoverflow.com/questions/30402169/... Java语言规范只是将它们区分为“类方法”(静态)和“实例方法”。所以他们仍然是所有的方法。 - xji
Java有lambda表达式,它们不是方法的函数 - Max Heiber


'方法' 是面向对象的词 '功能'。这就是它的全部内容(即没有真正的区别)。

不幸的是,我认为这里的许多答案都在延续或提出一个复杂而有意义的差异的想法。

真的 - 它没有那么多,只是同一个词的不同的词。

[后期补充]


事实上,作为 布莱恩尼尔 在评论中指出 这个问题,C ++标准在引用成员函数时从不使用术语'方法'。有些人可能认为这表明C ++并不是真正的面向对象语言;但是,我更愿意将其视为一个非常聪明的人群并不认为使用不同术语的特别强烈理由。


166
2017-09-30 23:48



好吧,ActionScript可以同时具有方法和函数,具体取决于函数是否绑定到类的实例(所有取决于它是如何定义的)。所以,有一个区别。 - IQAndreas
方法是一种特殊类型的函数,其中传递了一个隐式参数(定义该方法的类的实例)。这很重要,因为严格来说,函数不应该使用或修改不在其参数列表中的任何内容。 - ty1824
@ ty1824并不总是这种方法传递隐式参数的情况。在Python中, self 论证是明确的。许多语言都有静态方法,它们不会传递给实例。 - Max Heiber
@mheiber这些是一些有效的观点。关于自我,你是正确的,它是明确的 定义。关键是调用是隐式的,基于原始对象引用。有些语言支持覆盖a this 要么 self,但那些结构通常被称为函数,而不是方法。 - ty1824
@ ty1824 C ++,Scala,Python,Ruby,JavaScript和Scala都有静态方法,所以我认为它不仅仅是Java的东西。我也不喜欢它们:它们相当于使用对象(状态束),就好像它们是命名空间一样。 - Max Heiber


通常:方法是属于类的函数,函数可以在代码的任何其他范围内,因此您可以声明所有方法都是函数,但并非所有函数都是方法:

采取以下python示例:

class Door:
  def open(self):
    print 'hello stranger'

def knock_door:
  a_door = Door()
  Door.open(a_door)

knock_door()

给出的示例显示了一个名为“Door”的类,它有一个名为“open”的方法或操作,它被称为方法,因为它是在类中声明的。还有另一部分代码,下面是“def”,它定义了一个函数,它是一个函数,因为它没有在类中声明,这个函数调用我们在类中定义的方法,你可以看到,最后函数正在自己称呼。

正如您所看到的,您可以在任何地方调用函数,但是如果要调用方法,则必须传递与声明方法的类相同类型的新对象(Class.method(object)),或者必须调用对象内部的方法(object.Method()),至少在python中。

把方法想象成只有一个实体可以做的事情,所以如果你有一个Dog类,那么只在该类中有一个bark函数是有意义的,这将是一个方法,如果你还有一个Person类,它可能是有意义的写一个函数“feed”,因为它不属于任何类,因为人类和狗都可以被喂食,你可以称之为函数,因为它不属于任何类。


81
2017-10-01 00:33





一个非常一般的定义a之间的主要区别 功能 和a 方法

函数在类之外定义,而方法在类的内部和部分类中定义。


35
2017-10-28 23:08





如果你想在这里阅读“我对OO方法的介绍”

面向对象范式背后的想法是“威胁”软件由......好“对象”组成。现实世界中的对象具有属性,例如,如果您有员工,员工有姓名,员工ID,职位,他属于部门等。

该对象还知道如何处理其属性并对它们执行某些操作。如果我们想知道员工现在在做什么,我们会问他。

employe whatAreYouDoing.

“whatAreYouDoing”是发送给对象的“消息”。该对象知道如何回答这些问题,据说它有一个“方法”来解决这个问题。

因此,对象必须公开其行为的方式称为方法。因此,方法是工件对象必须“做”某事。

其他可能的方法是

employee whatIsYourName
employee whatIsYourDepartmentsName

等等

另一方面,函数是编程语言计算某些数据的方式,例如,您可能具有返回16的函数addValues(8,8)。

// pseudo-code
function addValues( int x, int y )  return x + y 
// call it 
result = addValues( 8,8 )
print result // output is 16...

由于第一种流行的编程语言(例如fortran,c,pascal)没有涵盖OO范例,因此它们只调用这些工件“函数”。

例如,C中的前一个函数将是:

int addValues( int x, int y ) 
{
   return x + y;
}

说一个对象有一个“函数”来执行一些动作并不是“自然的”,因为函数与数学东西更相关,而一个Employee几乎没有数学,但是你可以拥有与函数完全相同的方法,例如在Java中,这将是等效的addValues函数。

public static int addValues( int x, int y ) {
    return x + y;
}

看起来很熟悉?这是因为Java源于C语言的C ++和C ++。

最后只是一个概念,在实现中它们看起来可能相同,但在OO文档中这些被称为方法。

这是Java中以前的Employee对象的示例。

public class Employee {

    Department department;
    String name;

    public String whatsYourName(){
        return this.name;
    }
    public String whatsYourDeparmentsName(){
         return this.department.name();
    }
    public String whatAreYouDoing(){
        return "nothing";
    } 
    // Ignore the following, only set here for completness
    public Employee( String name ) {
        this.name = name;
    }

}

// Usage sample.
Employee employee = new Employee( "John" ); // Creates an employee called John

// If I want to display what is this employee doing I could use its methods.
// to know it.
String name = employee.whatIsYourName():
String doingWhat = employee.whatAreYouDoint();

// Print the info to the console.

 System.out.printf("Employee %s is doing: %s", name, doingWhat );

Output:
Employee John is doing nothing.

然后,差异在于应用它的“域”。

AppleScript有“自然语言”的概念,在某些时候OO有。比如Smalltalk。我希望您在阅读本文后理解对象中的方法可能更为合理。

注意:代码不是要编译的,只是作为一个例子。随意修改帖子并添加Python示例。


26
2017-10-08 00:07



好样的!关于方法如何命令对象的精彩阐述。这是理解OO的关键,你在这个答案中缺少的修辞是为什么OO在当今的行业中如此滥用。优秀的帖子。 - moffdub


简单的记忆方式:

  • F工作→ Free(自由意味着不属于某个对象或类)
  • 中号方法→ 中号ember(对象或类的成员)

20
2017-09-30 23:56



这是一个容易记住的方法!干杯 - Sijan Shrestha


在OO世界中,这两者通常用于表示相同的事物。

从纯数学和CS的角度来看,当使用相同的参数(f(x,y)=(x + y))调用时,函数将始终返回相同的结果。另一方面,方法通常与类的实例相关联。尽管如此,大多数现代OO语言在大多数情况下不再使用术语“功能”。许多静态方法可能非常类似于函数,因为它们通常没有状态(并非总是如此)。


16
2017-09-30 23:55