在objective-c中定義兩個類,用於測試對象的定義操作。
首先定義兩個類Vehicle和Ship。
@interface Vehicle
- (void)move;
@end
@interface Ship : Vehicle
- (void)shoot;
@end
對象定義操作的方法會有很多,下面羅列一些典型的操作方法。如下所示:
Ship *s = [[Ship alloc] init];
[s shoot];
編譯器不會報警,因為向s對象發送消息shoot,其類可以使用shoot方法處理這個消息;
[s move];
編譯器不會報警,因為向s對象發送消息move,可以上溯到Ship類的父類Vehicle,使用父類的方法move處理這個消息。這是面向對象開發的繼承特性的完美體現。
在編譯器編譯和運行時執行代碼過程中,都不會有任何問題出現。
Vehicle *v = s;
編譯器不會報警,因為向s對象所屬類的父類就是Vehicle。
[v shoot];
編譯器這時會報警,但運行時不會崩潰。因為編譯器僅僅知道它是一個Vehicle,而不知道它其實是一個Ship,但是我們自己知道,所以可以這麼用。
id obj = ...;
[obj shoot];
編譯器不會報警,因為它知道這個shoot方法是存在於整個項目中的。但在運行時,它可能會失敗,因為obj不一定是Ship類的對象,雖然它在編譯時可能是。
[obj someMethodNameThatNoObjectAnywhereRespondsTo];
編譯器會報警了,因為它不知道這個名稱如此亂七八糟的方法。因此,運行時也會失敗,根本沒有對象有這個方法來響應這個消息。
NSString *hello = @”hello”;
[hello shoot];
編譯器會報警了,因為它知道NSString沒有這個shoot方法。因此,運行時也會失敗。
Ship *helloShip = (Ship *)hello;
編譯器不會報警。
以上是學習objective-c的一些筆記。