方法和函数有什么区别?

有人可以在 OOP 上下文中提供方法功能的简单说明吗?

答案

函数是按名称调用的一段代码。可以传递数据以对其进行操作(即参数),还可以选择返回数据(返回值)。传递给函数的所有数据都被显式传递。

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

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

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

方法在对象上。
功能独立于对象。

对于 Java,只有方法。
对于 C,只有功能。

对于 C ++,这取决于您是否在课堂上。

“方法”“功能”的面向对象的单词。这几乎就是它的全部(即,没有真正的区别)。

不幸的是,我认为这里的许多答案可以使存在某些复杂的,有意义的差异的想法永存或发展。

真的 - 没有太多的东西,只是同一件事的不同词。

[后期补充]


实际上,正如Brian Neal在对此问题的评论中指出的那样,C ++ 标准在引用成员函数时从不使用术语 “方法”。有人可能会认为这表明 C ++ 并不是真正的面向对象的语言。但是,我更倾向于将其作为一种指示,即相当聪明的一群人认为没有特别强烈的理由使用另一个术语。

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

以以下 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 类,则仅在该类内部具有吠叫功能是有意义的,这将是一种方法;如果您也具有 Person 类,则对写一个不属于任何类别的函数 “feed”,因为人类和狗都可以被喂食,而您可以调用该函数,因为它特别不属于任何类别。

记住的简单方法:

  • ˚F油膏→˚FREE(免费意味着不属于一个对象或类)
  • 中号 ethod→M余烬(对象或类的一个成员)

关于函数方法之间主要区别的一个非常笼统的定义:

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

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

面向对象范例背后的思想是 “威胁” 该软件由.. 好 “对象” 组成。现实世界中的对象具有属性,例如,如果您有一个 Employee,该雇员具有姓名,雇员 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;
}

说一个对象具有执行某项操作的 “功能” 并不是 “自然的”,因为功能与数学相关性更高,而雇员对数学的了解却很少,但是您可以使用与功能完全相同的方法,例如在 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 示例。

在 OO 世界中,两者通常用来表示同一件事。

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

假设一个函数是一块代码块(通常具有自己的作用域,有时带有自己的闭包),可以接收一些自变量并且还可以返回结果。

方法是对象所拥有的功能(在某些面向对象的系统中,更确切地说它是类所拥有的)。被对象 / 类 “拥有” 意味着您通过对象 / 类来引用该方法。例如,在 Java 中,如果要调用对象 “门” 拥有的方法 “open()”,则需要编写 “door.open()”。

通常,方法还会获得一些额外的属性来描述它们在对象 / 类中的行为,例如:可见性(与封装的面向对象概念有关),它定义了可以从哪些对象(或类)中调用该方法。

在许多面向对象的语言中,所有 “功能” 都属于某个对象(或类),因此在这些语言中,没有不属于方法的功能。

方法是类的功能。用普通的术语来说,人们总是在交换方法和功能。基本上,您可以将它们视为同一件事(不确定全局函数是否称为方法)。

http://en.wikipedia.org/wiki/Method_(computer_science)