最近開始試著熟悉一些Objective-C的語法,不過其實一開始蠻排斥Obj-C,因為覺得它的語法和其它程式語言差異太多了.... 要熟悉需要花一段時間,而現在和它妥協了,或者應該是說被Steve Jobs強迫學習,而且也被強迫要買一台Mac機器... Orz (謎之音:這應該才是Steve Jobs的主要目的,因為要開發iphone/ipad/ipod touch... 請先來買一台Mac機器唷!)
本文只是筆者試著將Java的一些OO觀念套用在Obj-C,看看多型(Polymorphism)操作是如何用Obj-C來實現:
Human.h
定義一個Human Protocol,相當於Java中的Interface,裡頭只定義一個sayHello method。
@protocol Human -(void) sayHello; @end
Shen.h
定義一個Shen class,它繼承NSObject且會遵從Human這個Protocol (很奇怪吧~ 明明是個class卻是用interface的字眼)
#import "Human.h" @interface Shen : NSObject <Human> @end
Shen.m
實作Shen class的程式碼,sayHello方法只透過NSLog印出一些字串。
#import "Shen.h"
@implementation Shen
-(void) sayHello
{
NSLog(@"Hello, I'm Shen.");
}
@end
Jack.h
另一個遵從Human Procotol的Jack class。
#import "Human.h" @interface Jack : NSObject <Human> @end
Jack.m
#import "Jack.h"
@implementation Jack
-(void) sayHello
{
NSLog(@"Hello, I'm Jack.");
}
@end
YourDelegate.m
分別建立Shen和Jack這兩個物件,並傳給「say:(id<Human>)」這個方法來進行多型操作。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
Shen *shen = [[Shen alloc] init];
if([shen conformsToProtocol:@protocol(Human)] == YES)
{
NSLog(@"Shen conforms to Human\n");
}
[self say:shen];
Jack *jack = [[Jack alloc] init];
[self say:jack];
[shen release];
[jack release];
[window makeKeyAndVisible];
return YES;
}
-(void) say:(id<Human>) n
{
[n sayHello];
}
輸出結果:
Shen conforms to Human Hello, I'm Shen. Hello, I'm Jack.
在這個範例中,筆者還用了一個NSObject的「conformsToProtocol」方法,可以使用它來判斷該物件是否有遵從特定的Protocol。
