簡體   English   中英

方法重載和方法重寫Ios之間有什么區別

[英]What is the difference between method overloading and method overriding Ios

我是IOS的新手,任何人都可以告訴IOS中方法重載和覆蓋之間有什么區別。我已經完成了這個但是它是java,我想知道IOS一樣(目標c或swift,如果可能的話)一些代碼)

方法重載和覆蓋有什么區別?

  1. 重載發生在編譯時,而Overriding在運行時發生:重載方法調用與其定義的綁定在編譯時發生,但是重寫方法調用與其定義的綁定在運行時發生。

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

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

  4. 靜態綁定用於重載方法, 動態綁定用於重寫/重寫方法。

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

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

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

  8. 在進行方法重載時,參數列表應該不同。 方法Overriding中的參數列表應該相同。

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

ios中的方法重載:

objective-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

覆蓋Obj-C和Swift的工作方式與Java相同(在Swift中甚至用override關鍵字表示)。

顯然,有關重載的問題很多。 讓我們從Swift開始吧。 在Swift中,它通常以與Java相同的方式工作:

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

相同的方法名稱,接受不同的參數。 編譯器將根據參數的類型決定調用哪種方法。 但是,添加其他參數時:

func myFunction(a: Int, b: Int)

方法名稱實際上從myFunction(_:)更改為myFunction(_:b:)所以在傳統意義上,這不應該被稱為重載但我相信Swift只使用名稱的第一部分( myFunction )區分方法的情況,所以這實際上也可能是超載。 我對這個案子有點不確定。

在Obj-C中,沒有超載。

我們不能在Obj-C中聲明以下內容:

@interface MyClass : NSObject

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

@end

並且在更改參數數量時,我們還必須更改方法名稱

@interface MyClass : NSObject

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

@end

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

但是,即使在Obj-C中,我們也可以使用普通的舊C函數,它們可以重載:

void functionA(int a) {
   ...
}

void functionA(int a, int b) {
   ...
}

方法重載是java或c ++中存在的概念,但在objective-c中不存在。 方法覆蓋在所有語言中都是相同的概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM