我遇到過一個與Objective-C中的類繼承有關的奇怪場景。Objective-C繼承方法匹配
比方說,我有三個類A,B和C,從基類X.級別A繼承,B和X的構造函數:
- (id)InitWithString:(NSString*)someString andDelegate:(id<SomeProtocol>)aDelegate
唯一的區別是,每類使用不同的協議的代表。
會發生什麼情況,對於A和B,編譯器會嘗試使用C中的方法。警告通知我C類構造函數所需的協議未由提供的委託實現。委託本身沒有任何問題,因爲每個類都有一個委託,它爲類自己的構造函數實現正確的協議。在運行時一切正常,併爲所有類調用正確的函數。
我試過讓構造函數返回A *,B *或C *而不是匿名ID,儘管這仍然不能解決問題。
的作品正在鑄造到正確的類這樣的唯一的事情:
instanceOfA = [(A*)[A alloc] InitWithString:@"" andDelegate:aDelegate];
這似乎是多餘的和不必要的。我可能在這裏丟失了一些明顯的東西
永遠不要用最初的大寫字母來命名方法,這是一種令人憎惡的做法。你也不應該在名字中使用*和*。在C#中名稱'InitWithStringAndDelegate()'是好的,在Objective-C中它應該是'initWithString:delegate:'。 – PeyloW 2009-12-16 15:52:24
是的,使用「和」通常是一個壞主意,因爲如果添加其他參數,則必須更改它。最初的資本主要是品味和習慣的問題。我覺得沒有義務遵循蘋果的慣例,特別是因爲這有助於我輕鬆地在一個Cocoa類的子類中識別我自己的方法。然而,這是所有題外話:) – 2009-12-16 16:06:51