有人能简单解释OOP环境中的方法与函数吗?
当前回答
方法是类的函数。用正常的术语来说,人们在各处交换方法和功能。基本上,您可以将它们视为相同的东西(不确定全局函数是否称为方法)。
http://en.wikipedia.org/wiki/Method_(计算机科学)
其他回答
函数是一组可以用来处理数据的逻辑。
而Method是一个用于处理其所属对象的数据的函数。因此,从技术上讲,如果您有一个与您的类不完全相关但在类中声明的函数,那么它不是一个方法;这被称为糟糕的设计。
根据我的理解,方法是可以在类上执行的任何操作。它是编程中使用的通用术语。
在许多语言中,方法由函数和子程序表示。大多数语言用于这些的主要区别是,函数可能会返回一个值给调用者,而子程序可能不会。然而,许多现代语言只有函数,但这些函数可以选择不返回任何值。
例如,假设你想描述一只猫,你希望它能够打哈欠。您将使用Yawn方法创建一个Cat类,这很可能是一个没有任何返回值的函数。
只需两个字:非静态(“instance”)方法将一个隐藏指针指向“this”(作为其第一个参数),该对象就是您调用该方法的对象。
这是与常规独立函数的唯一区别,尽管是动态调度。
如果您感兴趣,请阅读以下详细信息。
我将尽量简短,并将使用C++作为示例,尽管我所说的几乎可以应用于每种语言。
对于您的CPU来说,函数和方法都只是一段代码。时期因此,当调用函数/方法时参数
好吧,我说过没有实际的区别。让我们再深入一点:
有两种类型的方法:静态和非静态静态方法类似于常规函数,但在类内部声明,该类的作用仅类似于命名空间非静态(“instance”)方法采用指向“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->printName()只是getName(user)的语法糖。
如果不使用动态调度,仅此而已。如果使用了它,那么它就有点复杂了,但是编译器仍然会发出一个看起来像函数的东西,将其作为第一个参数。
方法和函数之间有什么区别?
Python的官方文档是这样定义的(感谢@Kelly Bundy!):
作用向调用者返回某个值的一系列语句。它还可以传递零个或多个参数,这些参数可以在主体的执行中使用。另请参阅参数、方法和函数定义部分
方法在类主体内定义的函数。如果作为该类实例的属性调用,该方法将获取实例对象作为其第一个参数(通常称为self)。请参见函数和嵌套范围。
正方形是矩形,但并非所有矩形都是正方形。我解释世界的方式是,一个方法是一个函数,但并不是所有的函数都是方法。方法之所以独特,是因为它是一种特殊类型的函数,它也与类关联,并且可以访问类成员变量。
另请参见:
hasattr被称为方法,但它看起来像函数
一般答案是:
方法具有对象上下文(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++的优点。
推荐文章
- 在支持循环和函数的语言中,是否存在“goto”的合法用例?
- 为什么不使用异常作为常规的控制流呢?
- 如何在方法中访问“静态”类变量?
- 什么是序列化?
- 为什么c#不提供c++风格的'friend'关键字?
- String, StringBuffer和StringBuilder
- 存储库和服务层的区别?
- 每个递归都可以转换成迭代吗?
- 缓冲区是什么意思?
- DDD -实体不能直接访问存储库的规则
- 为什么STL如此严重地基于模板而不是继承?
- 如何在Objective-C中声明类级属性?
- 面向方面编程与面向对象编程
- 什么是ORM,它是如何工作的,我应该如何使用它?
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?