2011-05-01 74 views
2

我有類似這樣的代碼。當返回的值是類型轉換的父類時,類型方法的返回值?

MySubclassOfUIView *view = [aUIPickerView viewForRow:4 forComponent:0]; 

viewForRow:forComponent UIPickerView的方法返回一個UIView。 MySubclassOfUIView就是這樣:UIView的一個子類。

UIPickerView委託(此處未提及)使用一組MySubclassOfUIView對象來填充UIPickerView組件的行。因此,我知道viewForRow:forComponent方法將真正返回指向MySubclassOfUIView類型的對象的指針。

Xcode給了我這個警告。

不兼容的指針類型用'UIView *'類型的表達式初始化'MySubclassOfUIView *'。

因此,我想我會註冊它來修復警告,它給了我這個代碼。

MySubclassOfUIView *view = (MySubclassOfUIView*)[aUIPickerView viewForRow:4 forComponent:0]; 

並且警告消失。

請原諒我不穩定的C和Objective-C技能,但是我做了正確的事情(至今給出的上下文)?有其他更好的方法來處理這種情況嗎?

回答

3

如果您確定它會返回MySubclassOfUIView,那麼可以這樣做。如果有可能返回其他東西(比如你犯了一個錯誤,並向數組中添加了錯誤的東西),那麼你應該檢查這個類型並使用一個臨時變量。

UIView *temp = [aUIPickerView viewForRow:4 forComponent:0]; 
NSAssert([temp isMemberOfClass:[MySubclassOfUIView class]],[NSString stringWIthFormat:@"aUIPickerView returned the wrong class (%@)",[temp class]]); 
MySubclassOfUIView *theView = (MySubclassOfUIView*)temp; 
1

你可以做的是:

MySubclass* subFoo = [[MySubclass alloc] init]; 
MySuperclass* superFoo = subFoo; 

你不應該做的是:

MySuperclass* superFoo = [[MySuperclass alloc] init]; 
MySubclass* subFoo = superFoo; 

這是因爲你的Subclass將所有的屬性,選擇等離Superclass。但Superclass將不會有所有(..)的Subclass

其餘的,請參閱ughoavgfhw的回答。

+1

這被稱爲[可替代性](http://en.wikipedia.org/wiki/Liskov_substitution_principle)。 – 2011-05-01 21:29:55

相關問題