我有2个类,其中一个包含methodA,另一个包含methodB。所以在一个新的类中,我需要重写方法methodA和methodB。那么我如何在目标C中实现多重继承?我有点困惑与语法。Objective-C多重继承
回答
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中没有多重继承作为语言特性。
你知道有关协议,协议是实现多重继承
-1:协议与使用继承非常不同。 – FreeAsInBeer 2012-01-06 15:01:04
+1“捕获不分层次相关的类之间的相似性。” https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols。html – pokstad 2012-02-12 00:11:49
在这种情况下,两种方法都将被覆盖,协议将会起作用。在其他情况下,如果您想使用继承来重新使用代码,协议将无济于事。然而,通常可以通过让类超类彼此继承或通过组合它们来解决这个问题,如果一个子类实际上与2个类共享代码,通常有一种方法可以使它正确无误。 – 2012-06-15 11:57:53
这是我如何代码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>
类别不是多重继承。它们是将方法/函数加入到已经存在的类中的一种方法。 多重继承允许第三个类是一个或更多类(包括变量)的组合。 我喜欢类别。类别非常有用。但他们不是多重继承。 – 2013-05-31 13:18:50
但是,UIViewController的子类也可以“支持”,在这种情况下,我应该希望使用单例模式。 – 2013-06-20 02:11:35
从技术上讲,所有NSManagedObject“现在可以调用”[obj singleton]。我通过协议支持我所希望的那些。无论如何,和多重继承一样好。这只有当我想让子类支持父类的接口和实现时才是如此。如果只是实施,那么明显的构成就是要走的路。 – 2013-06-20 02:16:59
- 1. 多重继承
- 2. 多重继承
- 3. 多重继承()
- 4. 多重继承
- 5. 多重继承
- 6. 多重继承
- 7. 多重继承
- 8. 多重继承C#
- 9. C++多重继承
- 10. C++多重继承
- 11. 多重继承:2Classes1Method
- 12. 多重继承的分类?
- 13. Ruby中的多重继承
- 14. 多重继承的支持
- 15. C++多重继承铸造
- 16. Java的多重继承ActionBarActivity
- 17. 多重继承ambigious功能
- 18. LINQtoSQL中的多重继承?
- 19. 多重继承:QGraphicsPixmapItem和QGraphicsTextItem
- 20. 接口的多重继承
- 21. 优势多重继承的
- 22. Java:替代多重继承
- 23. 问题与多重继承
- 24. gcc thunk hack多重继承
- 25. C#多重继承泄漏
- 26. 多重继承的钻石
- 27. C++多重继承顺序
- 28. 删除多重继承
- 29. 多重继承冲突
- 30. 多重继承使用C#
的组成是非常往往是更好的方法来花费比继承,特别是如果你在代码上做很多单元测试。它提供了更大的灵活性,因为您可以轻松地更换实现而无需重新定义类本身。当你想要将模拟对象的ClassA和ClassB交换时,特别方便。即使在运行时,换出实现(例如FTPFileStore vs LocalFileStore)也会随着组合而变得更清晰。这并不意味着继承没有它的位置,但对多重继承的需要意味着我会重新考虑我的设计;) – d11wtq 2010-11-16 11:00:53
我不明白这一点。你不需要实例化'ClassA'和'ClassB'吗?在'MyClass'上调用'methodA:'是否在'ClassA'上自动调用'methodA:'? – zakdances 2013-08-30 07:59:40
不,但您仍然可以通过消息传递来共享行为,OOP原本应该工作的方式。如果您没有立即跳到想到您需要继承,而是考虑使用合成的解决方案,您会发现您开始以更易于维护的方式构建您的程序。当然,对于正确使用它的情况,ObjC具有基本的继承。 – d11wtq 2013-09-10 23:24:46