题目:1.Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
关于多继承:
首先 object-c不能够多继承,类似下面代码的这种方式是绝对通不过编译的.当然,你也可以把NSString前面的":"去掉再试试,呵呵!
那么有没有别的方式来替代呢?有,一种我们称之为伪继承,另一种我们可以通过ios中无处不在的@protocol委托方式来实现.
1.伪继承
1.1 实现消息转发功能
例子:
1.
1 - (NSMethodSignature*)methodSignatureForSelect or:(SEL)selector
{
NSMethodSignature* signature = [super methodSignatureForSelect or:selector];
if (!signature)
signature = [self.carInfo methodSignatureForSelect or:selector];
return signature;
}
2.
- (void)forwardInvocation:(NSInvocation *)invocation
{
SEL selector = [invocation selector];
if ([self.carInfo respondsToSelector:selector])
{
[invocation invokeWithTarget:self.carInfo];
}
}
1 Car *myCar = [Car car]; //Car为一个类
2 [(NSString *)myCar UTF8String] //这里调用NSString中的UTF8String方,注意Car中并未实现该方法
解释: 这里借iphone开发秘籍的例子来说明, self.carInfo是一个只读的NSString对象,存在于Car类中.例子中Car实例是无法正确的为另外一个对象(NSString)实现的选择器创建一个有效的签名。运行时当检查到当前没有有效的签名,即进入该对象(这里是myCar)的methodSignatureForSelect
注:如果您仍有疑问,可访问苹果的官方文档查询消息转发相关内容: 地址 http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/chapter_6_section_1.html#//
apple_ref/doc/uid/TP40008048-CH105-SW1
2.委托
在IOS中委托通过一种@protocol的方式实现,所以又称为协议.协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现.这叫好比我想买个手机,所以我有个buyIphone 方法,但是我不知道谁那买手机,所以把这个需求发布出去(比如公布在网站上),如果有卖手机的商人(也就是说他能实现buyIphone这个方法)看到,他就会接受我的委托,(在商人自己的类中实现),那么我的委托对象就指向了这个商人..当我要买手机的时候,直接找他就行了.
例如:
@protocol MyDelegate
-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money;
@end
@interface My : NSObject
{
id deleage;
}
@property(assign,nonatomic)id delegate;
@end
代码中声明了一个协议 名叫Mydelegate,在其中有一个buyIphone方法,即一个委托项。当我要购买手机的时候只需要通过delegate 调用 BuyIphone方法即可.
如下:
-(void)willbuy
{
[delegate buyIphone:@"iphone 4s" money:@"4888"];
}
我不必关心谁现实了这一委托,只要实现了这个委托的类,并且buyIphone是声明的委托中必须实现的方法,那么就一定能够得到结果.
例如:商人类实现了这一委托(用表示实现)
#import
#import "My.h"
@interface Business : NSObject
@end
然后在 @implementation Business 中调用 buyIphone方法
#import "Business.h"
@implementation Business
-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money
{
NSLog(@"手机有货,这个价钱卖你了,发货中!!");
}
@end
就ok啦。这样是不是也模拟了多继承呢?通过委托,其实你也就摆脱了去考虑多继承方面的事情,从而关注当前类。