2010-11-16 115 views
85

我有2个类,其中一个包含methodA,另一个包含methodB。所以在一个新的类中,我需要重写方法methodA和methodB。那么我如何在目标C中实现多重继承?我有点困惑与语法。Objective-C多重继承

回答

127

Objective-C不支持多重继承,而且你不需要它。使用组成:

@interface ClassA : NSObject { 
} 

-(void)methodA; 

@end 

@interface ClassB : NSObject { 
} 

-(void)methodB; 

@end 

@interface MyClass : NSObject { 
    ClassA *a; 
    ClassB *b; 
} 

-(id)initWithA:(ClassA *)anA b:(ClassB *)aB; 

-(void)methodA; 
-(void)methodB; 

@end 

现在你只需要调用有关伊娃的方法。它是更多的代码,但是Objective-C中没有多重继承作为语言特性。

+8

的组成是非常往往是更好的方法来花费比继承,特别是如果你在代码上做很多单元测试。它提供了更大的灵活性,因为您可以轻松地更换实现而无需重新定义类本身。当你想要将模拟对象的ClassA和ClassB交换时,特别方便。即使在运行时,换出实现(例如FTPFileStore vs LocalFileStore)也会随着组合而变得更清晰。这并不意味着继承没有它的位置,但对多重继承的需要意味着我会重新考虑我的设计;) – d11wtq 2010-11-16 11:00:53

+1

我不明白这一点。你不需要实例化'ClassA'和'ClassB'吗?在'MyClass'上调用'methodA:'是否在'ClassA'上自动调用'methodA:'? – zakdances 2013-08-30 07:59:40

+1

不,但您仍然可以通过消息传递来共享行为,OOP原本应该工作的方式。如果您没有立即跳到想到您需要继承,而是考虑使用合成的解决方案,您会发现您开始以更易于维护的方式构建您的程序。当然,对于正确使用它的情况,ObjC具有基本的继承。 – d11wtq 2013-09-10 23:24:46

-2

你知道有关协议,协议是实现多重继承

+58

-1:协议与使用继承非常不同。 – FreeAsInBeer 2012-01-06 15:01:04

+12

+1“捕获不分层次相关的类之间的相似性。” https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols。html – pokstad 2012-02-12 00:11:49

+7

在这种情况下,两种方法都将被覆盖,协议将会起作用。在其他情况下,如果您想使用继承来重新使用代码,协议将无济于事。然而,通常可以通过让类超类彼此继承或通过组合它们来解决这个问题,如果一个子类实际上与2个类共享代码,通常有一种方法可以使它正确无误。 – 2012-06-15 11:57:53

3

这是我如何代码singletonPattern为“父”基本上,我使用的协议和类别的组合方式。

我不能添加的唯一的东西是一个新的“伊娃”,但是,我可以推它与关联的对象。

#import <Foundation/Foundation.h> 
@protocol BGSuperSingleton 
+(id) singleton1; 
+(instancetype)singleton; 
@end 

@interface NSObject (singleton) <BGSuperSingleton> 

@end 

static NSMutableDictionary * allTheSingletons; 

+(instancetype)singleton 
{ 
    return [self singleton1]; 
} 
+(id) singleton1 
{ 
    NSString* className = NSStringFromClass([self class]); 

    if (!allTheSingletons) 
    { 
     allTheSingletons = NSMutableDictionary.dictionary; 
    } 

    id result = allTheSingletons[className]; 

    //PO(result); 
    if (result==nil) 
    { 
     result = [[[self class] alloc]init]; 
     allTheSingletons[className]=result; 
     [result additionalInitialization]; 
    } 
    return result; 
} 

-(void) additionalInitialization 
{ 

} 

每当我想一个类来“继承”这个BGSuperSingleton我只是做:

#import "NSObject+singleton.h" 

,并添加@interface MyNewClass() <BGSuperSingleton>

+2

类别不是多重继承。它们是将方法/函数加入到已经存在的类中的一种方法。 多重继承允许第三个类是一个或更多类(包括变量)的组合。 我喜欢类别。类别非常有用。但他们不是多重继承。 – 2013-05-31 13:18:50

+0

但是,UIViewController的子类也可以“支持”,在这种情况下,我应该希望使用单例模式。 – 2013-06-20 02:11:35

+0

从技术上讲,所有NSManagedObject“现在可以调用”[obj singleton]。我通过协议支持我所希望的那些。无论如何,和多重继承一样好。这只有当我想让子类支持父类的接口和实现时才是如此。如果只是实施,那么明显的构成就是要走的路。 – 2013-06-20 02:16:59