2015-10-27 154 views

回答

-1

方法重載是存在於Java或C++的一個概念,但在目標c不存在。 方法重寫在所有語言中都是相同的概念。

+0

你是什麼意思這是一個概念,不存在於objective-c或swift?您可以在類中清楚地實現func a(a:int)和func a(b:String)。這是否被認爲是超載? – Moriya

+4

@Animal Obj-C按名稱而不是按類型在方法之間不同。沒有超載。在Swift中你絕對可以超載。 – Sulthan

+0

我想說這只是obj-c中的一個術語,它本質上也是超載的。但我明白你的意思 – Moriya

3

方法重載的ios:

目標-C不支持方法重載,所以你必須使用不同的方法名稱。 但是請注意,該「方法名」包括方法簽名的關鍵字(在":"s之前來的參數名稱),所以下面是兩種不同的方法,即使他們都開始「writeToFile」:

-(void) writeToFile:(NSString *)path fromIntger:(int)anInt; 
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString; 

這兩種方法的名稱是「writeToFile:fromIntger:」和「writeToFile:fromString:」。在IOS

方法覆蓋:

方法覆蓋是一種語言特徵,其中一個類可以提供已經由它的父類中的一個提供了一種方法的實施方案。此類中的實現替換(即覆蓋)父類中的實現。

當您定義一個名稱與父類相同的方法時,該新方法會替換繼承的定義。新方法必須具有相同的返回類型,並採用與您覆蓋的方法相同的參數數量和類型。

下面是一個例子:

@interface MyClass : NSObject 

- (int)myNumber; 

@end 

@implementation MyClass : NSObject 

- (int)myNumber { 
    return 1; 
} 

@end 

@interface MySubclass : MyClass 

- (int)myNumber; 

@end 

@implementation MySubclass 

- (int)myNumber {  
    return 2;  
} 

@end 
1

它將覆蓋的OBJ-C和斯威夫特的工作原理相同的方式在Java中(在斯威夫特甚至override關鍵字表示)。

很明顯,關於超載有很多困惑。我們從Swift開始。在斯威夫特,一般它以同樣的方式作爲工作在Java中:

func myFunction(a: Int) 
func myFunction(a: String) 

同樣的方法名,接受不同的參數。編譯器將根據參數的類型決定調用哪個方法。然而,當添加額外的參數:

func myFunction(a: Int, b: Int) 

方法名居然如此傳統意義上的改變從myFunction(_:)myFunction(_:b:),這不應該叫超載但我相信斯威夫特僅使用的第一部分名稱(myFunction)在某些情況下區分方法,所以這實際上也可能會超載。我對這種情況有點不確定。

在Obj-C中,沒有超載。

我們不能宣佈以下的對象 - C:

和改變參數的數量時,我們也必須改變方法名

@interface MyClass : NSObject 

- (void)myMethod:(id)parameterA; 
- (void)myMethod:(NSInteger)parameterA withAnotherParam:(id)parameterB; 

@end 

注意方法名是-myMethod:-myMethod:withAnotherParam:。當方法名稱不同時,它不會超載。

然而,即使在對象 - 我們可以使用普通的老C函數,它們可以被重載:

void functionA(int a) { 
    ... 
} 

void functionA(int a, int b) { 
    ... 
} 
8
  1. 超載發生在編譯時而重寫發生在運行時:本重載方法調用與其定義的綁定發生在編譯時,但是重寫的方法調用與其定義的綁定發生在運行時

  2. 靜態方法可以被重載,這意味着一個類可以有多個同名的靜態方法。靜態方法不能被重載,即使你在子類中聲明瞭一個相同的靜態方法,它也與父類的相同方法無關。

  3. 最基本的區別是重載是在同一個類中完成的,而覆蓋基類和子類是必需的。重寫就是給父類的繼承方法一個特定的實現。

  4. 靜態綁定被用於重載方法和動態綁定被用於重寫/覆蓋方法。

  5. 性能:與重寫相比,重載提供了更好的性能。原因是重載方法的綁定是在運行時完成的。

  6. private和final方法可以被重載,但它們不能被覆蓋。這意味着一個類可以有多個同名的私有/最終方法,但是子類不能覆蓋其基類的私有/最終方法。

  7. 方法的返回類型在方法重載的情況下無關緊要,它可以相同或不同。但是,如果方法覆蓋,覆蓋方法可以有更具體的返回類型(refer this)。

  8. 執行方法重載時,參數列表應該不同。參數列表應該在方法覆蓋中相同。

  9. 覆蓋需要繼承,而不是重載。

+0

非常感謝你分享這個。詳細的解釋 – swiftBoy

相關問題