ObjC:我必须在头文件中指定继承吗?

时间:2011-08-31 21:04:48

标签: objective-c inheritance

ObjC对象的常见示例如下(对于头文件):

@interface A: B {
    int x;
    int y;
}
@end

是否可以避免头文件中的继承规范(即B)?


在我的例子中,框架A定义了类A,而另一个(子)框架B定义了类B(它是NSView的子类)。链接到B.在我的应用程序中,我链接到A,我不需要知道关于B的任何信息,除了它是NSView的子类。我想避免链接到B.但如果B在头文件中,我想我无法避免它,这就是为什么我问的是如何避免它。

7 个答案:

答案 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的内部,AB的子类。

答案 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