一千萬個為什麽

搜索

Objective-C指向實現協議的類的指針

我有三個實現相同協議的類,並且具有不實現協議的相同父類。通常我會將協議作為父類中的純虛函數,但我找不到Objective-C方法來做到這一點。

我想通過在超類中聲明純虛函數然後讓子實現這些函數來利用這些子類的多態性。然而,我發現這樣做的唯一Objective-C方法是讓每個孩子明確決定實現一個協議,當我這樣做時,超類不知道孩子們會實現該協議,所以有編譯時警告到處都是。

一些偽代碼如果沒有意義:

@interface superclass: NSObject
{}

@interface child1: superclass
{}

@interface child2: superclass
{}

這些類的消費者:

@class child1
@class child2
@class superclass

@interface SomeViewController: UIViewController
{
    child1 *oneView;
    child2 *otherView;
    superclass *currentView;
}

-(void) someMethod
{
    [currentView protocolFunction];
}

我發現在Objective-C中執行純虛函數的唯一好辦法就是在父類中放入 [self doesNotRecognizeSelector:_cmd]; ,但這並不理想,因為它會導致運行時錯誤而不是編譯時間。

最佳答案

Objective-C開發人員通常在這些情況下使用動態檢查而不是編譯時檢查,因為語言和框架很好地支持它。例如,您可以像這樣編寫方法:

- (void)someMethod
{
   //See if the object in currentView conforms to MyProtocol
    //
    if ([currentView conformsToProtocol:@protocol(MyProtocol)])
    {
       //Cast currentView to the protocol, since we checked to make
       //sure it conforms to it. This keeps the compiler happy.
        //
        [(SuperClass *) currentView protocolMethod];
    }
}

轉載註明原文: Objective-C指向實現協議的類的指針