2011-08-11 47 views
0

這聽起來很抽象。 比方說,我們有以下實例:將子類intance分配給超類實例

Shape *aShape 
Rectangle *aRect // Rectangle is a subclass or Shape 

aRect = [[Rectangle alloc] init]; 
// and some other code to set properties of aRect 

aShape = aRect 

但從對象 - 點,分配的最後一行是允許的,是有效的。 但是,在Shape類中,並不是Rectanlge的所有屬性都被定義 - 畢竟,Rectangle是Shape的子類。

這個賦值不會使某些aRect的屬性和值失效嗎?

回答

4

不,它不會使任何aRect的屬性或值無效。現實生活中的一個例子 - 僅僅因爲你把某人當作人,不會使他們成爲男人或女人;你只是不要用自己的性別來佔用你自己。在同樣的思路中,僅僅因爲你將它當作Shape絕不會使其變得更小Rectangle,你的代碼只是處理它的「形狀」方面,忽略任何「矩形」。

當然,Shape類可能會定義一些方法,可能會將實例的內部狀態更改爲不一致的狀態。但即使您通過向aRect發送消息調用相同的方法,這也會成爲問題。如果Rectangle類重寫這種方法以確保其狀態一致,則通過aShape發送該消息仍然會調用Rectangle定義的正確行爲。

2

這只是polymorphism並且不會使任何屬性不再「可訪問」。當然,通過思考或Objective-C消息傳遞,您仍然可以訪問這些值,但會發出警告,除非您將aShape轉換爲Rectangle

//This will work if it is a rectangle but will generate a warning 
[aShape someRectangleMethod]; 

//This will work without a warning 
[(Rectangle*)aShape someRectangleMethod]; 
相關問題