0

我有 C++ 背景,对于如何将特定概念转换为 Objective-C 有点困惑。

C++ 允许多重继承,所以你会看到很多这样的设计:

class Z {
    virtual void doSomething() {...}
};
class A : V, W, Z {
    void doSomething() {...}
};
class B : X, Y, Z {
    void doSomething() {...}
};
void callDoSomething(Z* inheritsFromZ) {
    inheritsFromZ->doSomething();
}
A *a = new A();
callDoSomething(a);

关键是你可以不知道指针处的对象继承FromZ的特定类型——你关心的是该对象实际上实现了类Z定义的接口。

Objective-C 不允许多重继承,但它允许一个类使用多个协议。对我来说,问题是我不知道如何将变量或选择器参数声明为“使用协议 Z 的东西”,就像 C++ 让您使用 Z* 一样。

例如,这里有一些快速的 Objective-C 伪代码:

@protocol A
- (void)selectorB;
@end

@interface C : NSObject <A>
@end
@implementation C
- (void)misc {
    E* e = [[E alloc] initWithCallableA:self];
}
- (void)selectorB {
    NSLog(@"In C");
}
@end

@interface D : NSObject <A>
@end
@implementation D
- (void)misc {
    E* e = [[E alloc] initWithCallableA:self];
}
- (void)selectorB {
    NSLog(@"In D");
}
@end

@interface E : NSObject
@end
@implementation E
- (id)initWithCallableA:(id)implementsA {
    self = [super init];
    if (self) {
        [implementsA selectorB]; // compiler doesn't like this
    }
    return self;
}
@end

当你所拥有的只是一个指向该类对象的更通用的指针时,关于如何调用由特定类实现的选择器有很多问题;例如,您可以访问您的presentingViewController,并且您知道它的类类型是M*,但是Xcode 抱怨它只是一个UIViewController*... 在这种情况下您可以只转换变量。(不漂亮,但它有效。)

这里的区别在于指针可以引用多个类类型,而您所知道的就是它所实现的任何类都实现了特定的协议。

4

2 回答 2

3
    [implementsA selectorB]; // compiler doesn't like this

这不是,因为编译器没有您在回答中认为的协议类型。见查克的评论。

可能您只是忘记导入协议。

无论如何,将协议添加到类型中是更好的方法。

于 2013-06-07T21:39:41.043 回答
2

当我写下这个问题时,我至少在某种程度上回答了我自己的问题。看起来语法是:

(id <A>)

而不是我临时使用的地方

(id)

这里

于 2013-06-07T21:12:58.767 回答