ObjC对象的常见示例如下(对于头文件):
@interface A: B {
int x;
int y;
}
@end
是否可以避免头文件中的继承规范(即B
)?
在我的例子中,框架A定义了类A
,而另一个(子)框架B定义了类B
(它是NSView
的子类)。链接到B.在我的应用程序中,我链接到A,我不需要知道关于B的任何信息,除了它是NSView
的子类。我想避免链接到B.但如果B
在头文件中,我想我无法避免它,这就是为什么我问的是如何避免它。
答案 0 :(得分:1)
没有。您必须为任何子类指定超类。我可以问你为什么要做这样的事情吗?
答案 1 :(得分:1)
您的应用程序将需要B的代码,因此您必须链接到B的框架,或者将B框架编译到您的A框架中。无论哪种方式,如果没有B的代码,就不能使用A的实例,并且必须在A标题中包含B的标题。
答案 2 :(得分:0)
如果未在界面中指定超类,则您的类是根类。这意味着它不会从任何其他类继承,因此它负责提供自己的所需方法的实现(大多数由NSObject类和协议定义)。由于这不是一项简单的任务,因此强烈建议您从提供这些方法的其他类继承。
答案 3 :(得分:0)
是的,你可以,你也会丢失alloc,init等的默认实现。这使你编写自己的alloc,init和NSObject中的其他东西
答案 4 :(得分:0)
你不能只包含你从A的标题本身继承的类的模拟版本吗?不确定这是否会导致问题,但它可以让您稍微清理链接需求。 B-new可以是B'Original
的一个类别答案 5 :(得分:0)
我现在有一个解决方案。我没有提供类,而是提供了这样的函数:
NSView* allocA();
在框架A的内部,A
是B
的子类。
答案 6 :(得分:0)
没有
您必须经常使用类集群解决此问题,保留私有实现或创建对象工厂。然后,您可以最小化模块之间的依赖关系。
如果你打算使用它,你仍然需要在某个阶段链接到子库(例如创建一个实例)。更新 - 展示私人实施
私有实施可能完全不透明。如果您确实公开了它们,可以使用以下两种方法来实现客户端可见的私有实现:
通过协议:
// MONDrawProtocol.h
// zero linkage required
// needs to be visible to adopt
// may be forwarded
@protocol MONDrawProtocol
- (void)drawView:(NSView *)view inRect:(NSRect)rect;
@end
// MONView.h
@protocol MONDrawProtocol;
@interface MONView : NSView
{
NSObject<MONDrawProtocol>* drawer;
}
@end
// MONView.m
#include "MONDrawProtocol.h"
@implementation MONView
- (void)drawRect:(NSRect)rect
{
[self.drawer drawView:self inRect:rect];
}
@end
通过基地:
// MONDrawer.h
// base needs to be visible to subclass and types which use MONDrawer
// may be forwarded
@interface MONDrawer : NSObject
- (void)drawView:(NSView *)view inRect:(NSRect)rect;
@end
// MONView.h
@class MONDrawer;
@interface MONView : NSView
{
MONDrawer * drawer;
}
@end
// MONView.m
#include "MONDrawer.h"
@implementation MONView
- (void)drawRect:(NSRect)rect
{
[self.drawer drawView:self inRect:rect];
}
@end