有人能简单解释OOP环境中的方法与函数吗?
当前回答
方法与功能的区别
在Microsoft上阅读此文档
包含可执行代码的成员统称为类的函数成员。上一节描述了方法,它们是函数成员的主要类型。本节介绍C#支持的其他类型的函数成员:构造函数、财产、索引器、事件、运算符和终结器。
所以方法是函数的子集。每个方法都是一个函数,但不是每个函数都是一种方法,例如,构造函数不能被称为方法,但它是一种函数。
其他回答
在OO世界中,这两个词通常用来表示同一件事。
从纯数学和CS的角度来看,当使用相同的参数(f(x,y)=(x+y))调用函数时,函数将始终返回相同的结果。另一方面,方法通常与类的实例相关联。尽管如此,大多数现代OO语言在很大程度上不再使用术语“函数”。许多静态方法可以很像函数,因为它们通常没有状态(不总是真的)。
类上的方法作用于类的实例,称为对象。
class Example
{
public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable".
public void UpdateData() // .. and manipulates it (This is a method by the way)
{
data = data + 1;
}
public void PrintData() // This is also a method
{
Console.WriteLine(data);
}
}
class Program
{
public static void Main()
{
Example exampleObject1 = new Example();
Example exampleObject2 = new Example();
exampleObject1.UpdateData();
exampleObject1.UpdateData();
exampleObject2.UpdateData();
exampleObject1.PrintData(); // Prints "2"
exampleObject2.PrintData(); // Prints "1"
}
}
一般答案是:
方法具有对象上下文(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++的优点。
方法和函数之间有什么区别?
Python的官方文档是这样定义的(感谢@Kelly Bundy!):
作用向调用者返回某个值的一系列语句。它还可以传递零个或多个参数,这些参数可以在主体的执行中使用。另请参阅参数、方法和函数定义部分
方法在类主体内定义的函数。如果作为该类实例的属性调用,该方法将获取实例对象作为其第一个参数(通常称为self)。请参见函数和嵌套范围。
正方形是矩形,但并非所有矩形都是正方形。我解释世界的方式是,一个方法是一个函数,但并不是所有的函数都是方法。方法之所以独特,是因为它是一种特殊类型的函数,它也与类关联,并且可以访问类成员变量。
另请参见:
hasattr被称为方法,但它看起来像函数
使用C#术语,函数和方法之间有区别。术语“函数成员”不仅包括方法,还包括其他非数据成员,如索引器、运算符、构造函数、析构函数和财产,所有成员都包含可执行代码。
reference=>专业C#和.NET 2021版-由Christina Nagel编写