这是一个初学者问题,所以请多多包涵。
我有一个使用第三方库(oniguruma,如果重要的话)的类。我希望库方法完全由我自己装饰,这样我就可以随时切换我的类的底层实现。像这样的东西:
// MyClass.h
@interface MyClass : NSObject ...
- (int) doSomething;
// MyClass.m
#import "some_library.h"
@implementation MyClass
- (int) doSomething
{
//call library's specific stuff
}
到目前为止一切顺利,但现在我需要在 MyClass 中使用一个实例变量,它具有一些库定义的类型(在“some_library.h”中声明的结构)。当然,我可以直接在界面部分导入库:
//MyClass.h
#import "some_library.h"
@interface MyClass : NSObject {
some_library_t blah;
}
- (int) doSomething;
@end
但这正是我想要避免的——让 MyClass 的用户知道它的实现细节。
我能否以某种方式从类的界面中“隐藏”特定于库的类型?标准做法是什么?
最佳答案
标准做法是使用 opaque pointers库类型或自定义实现结构(因此它也称为Pimpl - 实现指针)。
要做到这一点,您必须知道您可以定义指向不完整类型的指针,即您只声明存在的类型。例如:
struct FooImpl;
@interface Foo {
struct FooImpl* impl; // using pointer is ok for incomplete types
}
@end
然后您可以在实现文件中定义类型:
struct FooImpl {
// ... member definition
};
并分配/初始化它,例如在你的 -(id)init
方法中。
FooImpl
也可以是 SomeLibraryType
如果库类型是一个结构 - 然后你会以同样的方式转发声明它并在源文件中包含库头,它为您提供了结构定义。
关于objective-c - 是否可以有 "implementation-only"类(class)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2355758/