function - a title




方法和函數之間的區別 (20)

方法和功能的區別

從微軟閱讀這篇文檔

包含可執行代碼的成員統稱為類的函數成員。 前面的部分描述了方法,它們是函數成員的主要類型。 本節介紹C#支持的其他類型的函數成員:構造函數,屬性,索引器,事件,運算符和終結器。

所以方法是功能的子集。 每個方法都是一個函數,但不是每個函數都是一個方法,例如, constructor不能說是一種方法,但它是一個函數。

有人可以在OOP上下文中提供方法函數的簡單解釋嗎?


'method''function'的面向對象的單詞。 這幾乎是所有這一切(即,沒有真正的區別)。

不幸的是,我認為這裡的很多答案會延續或推進這種想法,即存在一些複雜的,有意義的差異。

真的 - 沒有太多的東西,對於同樣的東西只是不同的詞。

[後期添加]

事實上,正如Brian Neal在對這個問題的評論中指出的那樣,C ++標准在引用成員函數時從不使用術語“方法”。 有些人可能會認為C ++並不是真正的面向對象語言; 然而,我更願意將其作為一個跡象表明,一群相當聰明的人不認為有一個特別強烈的理由來使用不同的術語。


函數是按名稱調用的一段代碼。 它可以傳遞數據來操作(即參數),並可以選擇返回數據(返回值)。 所有傳遞給函數的數據都被顯式傳遞。

方法是由與對象關聯的名稱調用的一段代碼。 在大多數方面,除了兩個關鍵區別之外,它與功能相同:

  1. 一個方法隱式地傳遞了它被調用的對象。
  2. 一種方法能夠對類中包含的數據進行操作(記住一個對像是一個類的實例 - 類是定義,對像是該數據的一個實例)。

(這是一個簡單的解釋,忽略了scope等問題)


A class is the collection of some data and function optionally with a constructor.

While you creating an instance (copy,replication) of that particular class the constructor initialize the class and return an object.

Now the class become object (without constructor) & Functions are known as method in the object context.

So basically

Class <==new==>Object

Function <==new==>Method

在java中,它通常被稱為構造函數名稱與類名稱相同,但實際上,構造函數與實例塊和靜態塊相似,但具有用戶定義返回類型(即Class類型)

雖然類可以有一個靜態塊,實例塊,構造函數,函數該對象通常只有數據和方法。


以下是使用JavaScript示例的方法與功能的一些解釋:

test(20, 50); 是函數定義並用於運行某些步驟或返回可以在某處存儲/使用的東西。

您可以重複使用代碼:定義一次代碼並多次使用它。

您可以使用相同的代碼多次使用不同的參數,以產生不同的結果。

var x = myFunction(4, 3);   // Function is called, return value will end up in x

function myFunction(a, b) {
    return a * b;          // Function returns the product of a and b
}

var test = something.test(); 這裡的test()可以是一些對象的方法,或者是為內置對象定義了一個原型,這裡有更多解釋:

JavaScript方法是可以在對像上執行的操作。

JavaScript方法是一個包含函數定義的屬性。

JavaScript中內置的字符串屬性/方法:

var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!

自定義示例:

function person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
}

something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'

你也可以為String,Array等定義屬性

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        console.log(char + " does not appear in " + this);
    } else {
        console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

var something = "ThisIsSomeString"

// now use distance like this, run and check console log

something.distance("m");

一些參考: Javascript對象方法Functions , 更多原型的信息


函數或方法是一個指定的可調用代碼片段,它執行一些操作並可選擇返回一個值。

C語言中使用術語函數。 JavaC#人會說它是一種方法(在這種情況下,函數是在類/對像中定義的)。

一個C ++程序員可能會把它稱為一個函數或者有時是方法(取決於他們是在編寫過程式c ++代碼還是正在做面向對象的C ++方式,另外一個C / C ++程序員可能會把它稱為函數,因為術語'method'是在C / C ++文獻中不常用)。

你只需調用它的名字就可以使用一個函數,

result = mySum(num1, num2);


您可以通過首先引用其對象來調用方法,

result = MyCalc.mySum(num1,num2);

函數是一組可用於處理數據的邏輯。

而Method則是用來處理它所屬對象的數據的函數。 所以從技術上講,如果你有一個函數不是與你的類完全相關的,而是在類中聲明的,它不是一種方法; 這被稱為糟糕的設計。


函數是一組可用於處理數據的邏輯。 而Method則是用來處理它所屬對象的數據的函數。 所以從技術上講,如果你有一個函數不是與你的類完全相關的,而是在類中聲明的,它不是一種方法; 這被稱為糟糕的設計。


在C ++中,有時使用方法來反映類的成員函數的概念。 然而,最近我在第586頁的“The C ++ Programming Language 4th Edition”一書中找到了一個聲明:“派生類”

虛擬功能有時被稱為方法。

這有點令人困惑,但他有時會這樣說,所以它大致合理,C ++創建者傾向於將方法視為可以在對像上調用的函數,並且可以表現為多態。


在諸如Object Pascal或C ++的OO語言中,“方法”是與對象關聯的函數。 因此,例如,“狗”對象可能具有“樹皮”功能,這將被視為“方法”。 相反,“StrLen”函數是獨立的(它提供了作為參數提供的字符串的長度)。 因此它只是一個“功能”。 Javascript在技術上也是面向對象的,但是與像C ++,C#或Pascal這樣的全面語言相比,它面臨著許多限制。 儘管如此,這種區別應該仍然存在。

一些額外的事實:C#完全面向對象,因此您不能創建獨立的“函數”。 在C#中,每個函數都綁定到一個對象,因此在技術上就是一個“方法”。 踢球者是C#中很少有人將他們稱為“方法” - 他們只是使用術語“功能”,因為沒有任何真正的區別。

最後 - 任何Pascal大師都不會在這裡跳上我--Pascal也區分“函數”(返回值)和“程序”,而不是。 雖然你可以選擇返回一個值,但C#並沒有明確地區分這個區別。


如果您想在這裡閱讀“我的OO方法介紹”

面向對象範例背後的想法是“威脅”軟件是由“好的”對象組成的。 真實世界中的對象具有屬性,例如,如果您有一個Employee,那麼該員工有一個名稱,一個員工ID,一個職位,他屬於一個部門等。

該對像還知道如何處理它的屬性並對它們執行一些操作。 假設我們想知道員工現在正在做什麼,我們會問他。

employe whatAreYouDoing.

“whatAreYouDoing”是發送給對象的“消息”。 對象知道如何回答這個問題,據說它有一個解決問題的“方法”。

所以,對象必須公開其行為的方式稱為方法。 因此,方法對象必須“做”某些東西。

其他可能的方法是

employee whatIsYourName
employee whatIsYourDepartmentsName

等等

另一方面,函數是編程語言必須計算某些數據的方式,例如,您可能具有函數addValues(8,8),它返回16

// 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)沒有涵蓋面向對象的範例,他們只能調用這些構件的“功能”。

例如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示例。


對我來說:如果我同意,方法和函數的功能是相同的:

  • 一個函數可能會返回一個值
  • 可能期望參數

就像任何一段代碼一樣,您可能會放入一些對象,結果可能會產生一個對象。 在這樣做的過程中,他們可能會改變對象的狀態,但這並不會改變他們對我的基本功能。

在調用對像或其他代碼的函數時可能會有一個不同的定義。 但是這不是口頭上的區別,這就是為什麼人們交流他們? 提到計算的例子,我會小心的。 因為我聘請僱員做我的計算:

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

通過這樣做,我可以依靠雇主負責計算。 如果他想要更多的錢,我就可以釋放他,讓卡比奇收集者處理未使用員工的功能完成剩下的工作,並獲得新員工。

甚至認為一個方法是一個對象函數而一個函數是不相連的計算對我來說無能為力。 函數描述符本身,理想情況下函數的文檔將告訴我它需要什麼以及它可能會返回什麼。 其餘的,像操縱某個對象的狀態對我來說並不是真的透明。 我確實希望功能和方法能夠交付和操縱他們所宣稱的內容,而不必詳細了解他們是如何做到的。 即使是純粹的計算功能也可能會改變控制台的狀態或追加到日誌文件中。


從歷史上看,可能與“方法”是一種不返回價值的東西有微妙的區別,而“功能”則會有所不同。每種語言都有自己的術語詞典和特殊含義。

“C”中“功能”一詞表示程序例程

Java中 ,術語“功能”沒有任何特殊含義。 而“方法”是指形成類的實現的例程之一。

C#中 ,它將翻譯為:

public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function

但是,真的,我重申,這兩個概念之間確實沒有什麼區別。 如果在有關Java的非正式討論中使用術語“功能”,人們會認為你的意思是“方法”並繼續。 不要將它用在有關Java的適當文檔或演示文稿中,否則你會顯得很傻。


恕我直言,人們只是想發明新的單詞,以便在程序員之間進行通信時,他們想要引用對象內的函數。

如果你說的方法是你在課堂上的功能。 如果你說功能,你的意思是簡單地在班級以外工作。

事實是,這兩個詞都用來描述功能。 即使你錯誤地使用了它,沒有錯誤發生。 這兩個詞都很好地描述了你想在你的代碼中實現什麼。

函數是一個代碼,它必須扮演一個做某事的角色( 一個功能 )。 方法是解決問題的方法

它做同樣的事情。 這是一回事。 如果你想要超級精確並遵循約定,你可以調用方法作為對象內部的函數。


我知道很多其他人已經回答,但我發現以下是一個簡單而有效的單行答案。 儘管在這裡看起來並不比其他答案好,但是如果你仔細閱讀它,它就擁有了你需要知道的有關方法和功能的一切。

方法是一個函數,它具有一個已定義的接收方,在OOP中,方法是對象實例的函數。


方法在一個對像上。
函數獨立於對象。

對於Java,只有方法。
對於C,只有函數。

對於C ++來說,這取決於你是否在課堂上。


根據我的理解,一種方法是可以在課堂上進行的任何操作。 這是編程中使用的一個通用術語。

在許多語言中,函數和子例程都表示方法。 大多數語言使用的主要區別是函數可能會將值返回給調用者,而子例程可能不會。 然而,許多現代語言只有功能,但這些功能可以不返回任何值。

例如,讓我們說你想描述一隻貓,你希望能夠打哈欠。 您將創建一個帶有Yawn方法的Cat類,它很可能是一個沒有任何返回值的函數。


比方說一個函數是一段代碼(通常有自己的作用域,有時也有自己的閉包),它可能會接收一些參數,也可能返回一個結果。

方法是一個由對象擁有的函數(在一些面向對象的系統中,說它由一個類擁有是更正確的)。 被對象/類“擁有”意味著你通過對象/類來引用該方法; 例如,在Java中,如果您想調用“door(open)()”所擁有的方法,您需要編寫“door.open()”。

通常,方法還會獲得一些額外的屬性,描述它們在對象/類中的行為,例如:可見性(與面向對象的封裝概念有關)定義從哪個對象(或類)調用該方法。

在許多面向對象的語言中,所有“功能”都屬於某個對象(或類),因此在這些語言中沒有功能不是方法。


自從您提到Python以來,以下內容可能是大多數現代面向對象語言中方法和對象之間關係的有用例證。 簡而言之,他們稱之為“方法”的只是一個獲得額外參數的函數(正如其他答案指出的那樣),但是Python比大多數語言更加明確。

# perfectly normal function
def hello(greetee):
  print "Hello", greetee

# generalise a bit (still a function though)
def greet(greeting, greetee):
  print greeting, greetee

# hide the greeting behind a layer of abstraction (still a function!)
def greet_with_greeter(greeter, greetee):
  print greeter.greeting, greetee

# very simple class we can pass to greet_with_greeter
class Greeter(object):
  def __init__(self, greeting):
    self.greeting = greeting

  # while we're at it, here's a method that uses self.greeting...
  def greet(self, greetee):
    print self.greeting, greetee

# save an object of class Greeter for later
hello_greeter = Greeter("Hello")

# now all of the following print the same message
hello("World")
greet("Hello", "World")
greet_with_greeter(hello_greeter, "World")
hello_greeter.greet("World")

現在比較函數greet_with_greeter和方法greet :唯一的區別是第一個參數的名稱(在我稱之為“自我”的方法中,我稱之為“greeter”)。 所以我可以用完全相同的方式使用greet方法,因為我使用greet_with_greeter函數(使用“dot”語法來獲取它,因為我在類中定義了它):

Greeter.greet(hello_greeter, "World")

所以我已經有效地將一種方法轉變為一種功能。 我可以把一個函數變成一個方法嗎? 那麼,因為Python可以讓你在定義好類之後把它們混淆,那麼讓我們試試:

Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")

是的,函數greet_with_greeter現在也被稱為方法greet2 。 這顯示了方法和函數之間唯一真正的區別:當你通過調用object.method(args)來調用某個對象的“on”方法時,該語言神奇地將其變為method(object, args)

(OO純粹主義者可能認為一種方法與函數不同,如果你進入高級的Python或Ruby--或者Smalltalk! - 你將會開始看到他們的觀點,而且一些語言給方法特殊的訪問對象的位,但是主要的概念差異仍然是隱藏的額外參數。)


讓我們不要過於復雜,應該是一個非常簡單的答案。 方法和功能是一回事。 當一個函數在類的外部時,你可以調用一個函數,而當你在一個類中編寫函數時,你可以調用一個函數。







terminology