2012-08-07 103 views
2

我有一個名爲「BaseEntry」的類和一些特定的類,如「EntryFoo」和「EntryBar」,它們是「Base Entry」的子類。iOS:方法返回類型應該是X類的子類

現在有一個函數getEntry,它應該返回一個Object,它是BaseEntry的子類。在Java中這不會是一個問題,但我不知道如何解決這個Objective-C的iOS。

感謝您的幫助! 亞歷克斯

+0

你想編寫一些代碼,編譯器不會讓你?或者你是否想對自己執行一些編譯時類型檢查? – Thilo 2012-08-07 08:08:50

+0

' - (BaseEntry *)getEntry;'不起作用? – Thilo 2012-08-07 08:10:03

+0

是 - (BaseEntry *)getEntry;可以工作,但該方法應該返回EntryFoo或EntryBar,因爲在這個類中需要特定的變量和函數。 – 2012-08-07 08:19:13

回答

3

在Objective-C中做到這一點的標準方法是返回一個'id'類型的對象。在Java中將其視爲Object。但是,id稍好一點,因爲您可以將返回值分配給類型化的值,而無需強制轉換。

爲了澄清,你的選擇是:

// Assuming -(BaseEntry*)getEntry; 
id entry = [obj getEntry]; 
[entry messageOnlyOnFooEntry]; 

// Assuming -(BaseEntry*)getEntry; - note cast required 
FooEntry *entry = (FooEntry*)[obj getEntry]; 
[entry messageOnlyOnFooEntry]; 

// Assuming -(id)getEntry; - no cast required 
FooEntry *entry = [obj getEntry]; 
[entry messageOnlyOnFooEntry]; 
+1

這是正確的,在目標C中不支持協變返回類型,它們在Java中幾乎不受支持。它們不是在OOP中利用的設計模式。返回id並根據您的需要投射指針。 – 2012-08-09 09:25:31

0
BaseEntry gE = [[BaseEntry alloc] init]; // Allocate and init a BaseEntry object 
returnGetEntryHere = [ge getEntry]; // This will execute getEntry which is a method in BaseEntry 

你有沒有嘗試過直到現在呢?如果你發佈了一些代碼,也許人們可以幫助你解決你對Objective-C項目的誤解和缺點

相關問題