有人能简单解释OOP环境中的方法与函数吗?


当前回答

为了我:如果我同意:

函数可以返回值可能需要参数

就像任何一段代码一样,你可能有你放入的对象,你可能会有一个作为结果出现的对象。在这样做的过程中,他们可能会改变对象的状态,但这不会改变他们对我的基本功能。

调用对象或其他代码的函数时可能存在定义差异。但这不就是语言差异的原因吗?这就是为什么人们会互换它们?上面提到的计算示例我会小心处理。因为我雇佣员工来计算:

new Employer().calculateSum( 8, 8 );

通过这样做,我可以依靠雇主负责计算。如果他想要更多的钱,我会让他自由,让碳水化合物收集者处理闲置员工的职能来完成剩下的工作,并雇佣一名新员工。

即使争论一个方法是一个对象函数,而一个函数是不相连的计算,这也无助于我。函数描述符本身以及理想的函数文档将告诉我它需要什么以及它可能返回什么。其余的,比如操纵某个对象的状态,对我来说并不是真正透明的。我确实希望函数和方法都能传递和操纵它们所声称的内容,而不需要详细了解它们是如何做到的。即使是纯计算函数也可能更改控制台的状态或附加到日志文件。

其他回答

根据我的理解,方法是可以在类上执行的任何操作。它是编程中使用的通用术语。

在许多语言中,方法由函数和子程序表示。大多数语言用于这些的主要区别是,函数可能会返回一个值给调用者,而子程序可能不会。然而,许多现代语言只有函数,但这些函数可以选择不返回任何值。

例如,假设你想描述一只猫,你希望它能够打哈欠。您将使用Yawn方法创建一个Cat类,这很可能是一个没有任何返回值的函数。

方法与功能的区别

在Microsoft上阅读此文档

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

所以方法是函数的子集。每个方法都是一个函数,但不是每个函数都是一种方法,例如,构造函数不能被称为方法,但它是一种函数。

一般答案是:

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

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

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

在JavaScript(ES6)中,您可以根据需要自定义函数上下文(this),通常必须链接到(this)对象实例上下文。在Java世界中,你总是听到“只有OOP类/对象,没有函数”,但如果你仔细观察Java中的静态方法,它们实际上是在全局/空上下文(或类的上下文,没有实例化)中,所以只有没有对象的函数。Java老师可以告诉你,函数是C++中C的雏形,在Java中已经过时了,但他们告诉你这是为了简化历史,避免新手提出不必要的问题。如果您在Java 7版本之后看到,您可以发现许多用于简化并行计算的纯函数编程元素(甚至不是来自C,而是来自1988年的Lisp),而且它不是OOP类风格。在C++和D世界中,事情变得更强大,您可以将函数和对象与方法和字段分开。但在实践中,您会再次看到没有this的函数和带有this的方法(带有对象上下文)。在FreePascal/Lazarus和BorlandPascal/Dephi中,函数和对象(变量和字段)的分离项通常与C++类似。Objective-C来自C世界,因此必须使用方法插件将C函数和Objective-C对象分开。C#与Java非常相似,但有许多C++的优点。

面向对象范例背后的思想是“处理”软件由。。好的“对象”。现实世界中的对象具有财产,例如,如果您有一个Employee,则该员工具有姓名、员工id、职位、他属于某个部门等。

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

employe whatAreYouDoing.

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

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

其他可能的方法有

employee whatIsYourName
employee whatIsYourDepartmentsName

etc.

另一方面,函数是编程语言计算某些数据的方式,例如,您可以使用返回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有一种“自然语言”matphor的概念,在某种程度上OO也有这种想法。例如Smalltalk。我希望在阅读了这篇文章之后,您可以更容易地理解对象中的方法。

注意:代码不是要编译的,只是作为示例。请随意修改文章并添加Python示例。

函数是主要属于面向过程编程的概念,其中函数是一个可以处理数据并返回值的实体

方法是面向对象编程的概念,其中方法是类的成员,该类主要对类成员进行处理。