2010-07-27 54 views

回答

19

IMO的主要好處是在邏輯上執行非常類似的任務的方法/功能的命名方面的一致性,並且通過接受不同的參數而略有不同。這允許在多個實現中重用相同的方法名稱。

例如重載:(好)

function Person[] FindPersons(string nameOfPerson) { ... } 
function Person[] FindPersons(date dateOfBirth) { ... } 
function Person[] FindPersons(int age, string dogsName) { ... } 

優於「唯一命名的」功能:(壞)

function Person[] FindPersonsByName(string nameOfPerson) { ... } 
function Person[] FindPersonsByDOB(date dateOfBirth) { ... } 
function Person[] FindPersonsByAgeAndDogsName(int age, string dogsName) { ... } 

這樣,編碼器編寫客戶端,它調用/消耗這些功能都可以在一個較高的操作(「我需要找到一個人」)並且不需要記住/定位一個人爲的功能名稱。

使用靜態類型,編譯器將根據使用參數與適用的過載匹配。對於動態輸入,這種相同的匹配會在運行時發生,如果找不到適當的匹配,可能會導致失敗。

+2

我同意,但你需要小心,如果由於某種原因,現在你想創建FindPerson(字符串城市),所以我不知道這是最好的例子...參數仍然有效,雖然 – h4lc0n 2013-05-25 09:46:01

+0

真的很好的解釋。 。感謝提高我的知識,先生:)你能否也解釋我「以相同的方式覆蓋方法的使用?」 – iPatel 2014-07-15 10:43:45

+1

@iPatel - 覆蓋是[亞型多態性]的推動者(http://en.wikipedia.org/ wiki/Polymorphism_(computer_science)#Subtyping),在虛擬類方法(通常是抽象的)或接口中實現 - 查看維基百科鏈接中的示例。另見[見這裏](http://en.wikipedia.org/wiki/Method_overriding)。另外,'overloading'有時也被稱爲'adhoc polymorphicism'。 – StuartLC 2014-07-15 11:04:10

3

函數/方法有時可以採用不同類型的參數來完成它的工作。這是功能重載的時間。否則,你將不得不有不同的功能相同的功能,這是混亂和不好的做法。

  • 構造函數是函數,所以它們可以被重載。這非常方便。
  • 當你第一次進入超載時,很容易過分幻想,認爲你給未來的開發者一個好處,給他們更方便的選擇。儘量避免這種情況。不必要的過載可能會使未來的開發人員產生混淆並導致不必要的代碼維護。
1

它針對對象的屬性爲同一對象提供多種行爲。

例如,稱爲addUs(a,b)的方法增加了ab

這樣的定義是:

int addUs(int a, int b){ 
    return a+b; 
} 

但是現在,如果你希望你的參數是一個類的對象說:

class Demo{ 
    int height; 
    int width; 
} 

你想同樣的功能addUs()返回一個新對象這將具有屬性高度和寬度,其值爲作爲傳遞的2個參數的寬度的高度之和的值。

所以,現在的定義是:

Demo addUs(Demo a Demo b){ 
    Demo this; 
    this.height = a.height + b.height; 
    this.width = a.width + b.width; 
    return this; 
} 
+0

那是什麼編程語言?你的和=密鑰是否被破解? ;) – masterxilo 2014-03-14 09:39:40

1

有時你必須完成基於所提供的上下文和投入同樣的事情的多種方式。對於類型嚴格的靜態語言,函數定義可能非常嚴格,需要事先明確定義。

構造函數通常是最好的典型例子。如果你正在構建一個複雜的對象並且沒有完成所有的部分,你仍然希望能夠將你有的東西傳遞給一個構造函數,並讓它填充其餘部分。而你所擁有的東西可能會大不相同,需要以不同的方式定義爲構造函數的參數。

6

非常有效的問題。

您在命名上得到一致性,但代價是確切實施的含糊性。

  • 真正的問題是人的記憶 方法名稱,對吧?我們發現它更易於記憶 常用的名稱。

  • 和經濟的打字,允許 更短的方法名稱?更少的名字意味着(數學上) 名字本身攜帶較少的信息。

這兩個問題不應該擔心,IDE可以根據前幾個字符和參數/返回類型快速查找/猜測/插入方法名稱。

但我確實認爲有一個代碼的精確性,以及一個好處。

3
  1. 根據參數對同一功能的多種行爲。
  2. 您的功能可能需要處理一些可選的細節。 例如,以下示例想要將成員添加到Members對象中,並使用用戶知道的任何細節。這裏的年齡是創建會員的最小細節,年齡和memberOf是可選的。 [注:未在代碼片段提供的功能定義。]

    public class Members 
    { 
        public System.Collections.Generic.List<Member> TeamMembers; 
    
        public AddMember(Member m) {} 
        public AddMember(string name) {} 
        public AddMember(string name, int age) {} 
        public AddMember(string name, int age, string[] memberOf) {} 
    
        public class Member 
        { 
         public string Name { get; set; } 
         public int Age { get; set; } 
         public string[] MemberOf { get; set; } 
        } 
    } 
    
  3. 您可能希望你的方法適用於多種類型的對象。 ex。 Console.WriteLine()方法可以在控制檯上寫空行,bool,int,string,char [],float等。這是因爲函數重載而成爲可能的。

+0

是不是默認參數更適合這個例子?我不認爲這是很好的使用函數重載,尤其是因爲您必須複製代碼或在更復雜的內部調用更簡單的方法(使用更少的參數)。 – Davorin 2011-11-04 16:11:49

+0

默認參數可以提供答案,以增加更多參數。但是這裏的實質是方法重載允許您根據參數的類型和插入的參數的數量執行完全不同的代碼塊(方法)。在AddMember的前兩個變體中,您可以添加一個Member對象作爲參數或字符串;他們的執行可能會有不同的路線。例如,將此功能與Console.Write()方法進行比較。 – SaravananArumugam 2011-11-04 18:37:48

0

你可能想用不同參數的代碼做類似的事情。如果你必須給每個函數一個不同的名字,代碼的可讀性將會非常糟糕。

5

重載是多態的一種形式。它允許程序員在不改變名稱的情況下編寫函數,以在概念上在不同類型的數據上做同樣的事情。 (它也允許編程人員根據參數編寫函數以在概念上做不同的事情,但這是一個真正的壞主意。)

這允許表示法的一致性,這對於讀取和編寫代碼都是很好的。 I/O是一種非常常見的用途。在大多數常用語言中,有一個函數或運算符會輸出任何您喜歡的內容,例如C中的printf()和親屬,C++中的operator<<(),我以前使用的舊BASICS中的PRINT等等。需要像printint()printstring(),printfloat()等功能的語言從來沒有出現過。

它適用於C++模板和其他任何構造,在編寫代碼時您不一定知道變量類型是什麼。

0

它是具有相同名稱的函數的機制,但在不同的實例上執行不同的任務。我們很容易記住常用的名稱。