是否可以拥有"仅限实施"的班级成员?

use*_*291 5 xcode cocoa objective-c

这是一个初学者的问题所以请耐心等待.

我有一个使用第三方库的课程(oniguruma,如果重要的话).我希望库方法完全由我自己修饰,这样我就可以随时切换我的类的底层实现.就像是:

// MyClass.h

@interface MyClass : NSObject ...

- (int) doSomething;


// MyClass.m

#import "some_library.h"

@implementation MyClass

- (int) doSomething 
{
   //call library's specific stuff
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这么好,但现在我需要在MyClass中使用一个具有一些库定义类型的实例变量(在"some_library.h"中声明的结构).当然我可以直接在界面部分导入库:

//MyClass.h

#import "some_library.h"

@interface MyClass : NSObject {
    some_library_t blah;
}
- (int) doSomething;
@end
Run Code Online (Sandbox Code Playgroud)

但这正是我想要避免的 - 让MyClass的用户知道它的实现细节.

我可以以某种方式"隐藏"我的类界面中特定于库的类型吗?什么是标准做法?

Geo*_*che 8

标准做法是使用对库类型或自定义实现结构的不透明指针(因此它也称为Pimpl - 指向实现的指针).

要做到这一点,你必须知道你可以定义指向不完整类型的指针,即你只声明存在的类型.例如:

struct FooImpl;

@interface Foo {
    struct FooImpl* impl; // using pointer is ok for incomplete types
}        
@end
Run Code Online (Sandbox Code Playgroud)

然后,您可以在实现文件中定义类型:

struct FooImpl {
    // ... member definition
};
Run Code Online (Sandbox Code Playgroud)

并在您的-(id)init方法中分配/初始化它.

FooImpl也可能是SomeLibraryType因为库类型是一个结构 - 然后你以相同的方式转发声明它并在源文件中包含库头,它为你提供了结构定义.