簡體   English   中英

我如何一般地使用類別來實現協議?

[英]How do I implement a protocol generically with a category?

如何用協議的某些通用實現來裝飾類?

對不起,這可能是一個顯而易見的問題。 我是目標c的新手,所以我仍然在踩水。

我有一個想要通用實現的協議:

@protocol SelectableElement <NSObject>
@property BOOL selected;
@end

我有幾個想要選擇的對象:

@interface Widget : NSObject <SelectableElement>
@end

@interface Duhicky : NSObject <SelectableElement>
@end

我想做的就是編寫一次協議的實現,並確保兩個對象都以這種方式實現。

我不認為我可以編寫一個通用類別並將其綁定到兩者,所以我猜想這樣做的一種方法是在通用類NSObject上添加實現類別:

@implementation NSObject (Selectable)
- (BOOL)selectable
{
    if (![self conformsToProtocol:@protocol(SelectableElement)]) return;

    return YES; // Use associative storage for this?
}

- (void)setSelectable:(BOOL)selectable
{
    if (![self conformsToProtocol:@protocol(SelectableElement)]) return;

    // set this associatively?
}
@end

當然,我不能定義一個屬性變量來做到這一點,我將需要使用關聯對象存儲庫...我這里沒有演示。

這是將可選行為通用地添加到實現可選元素協議的任何事物的唯一方法嗎? 還是我想念一種更明顯的方式?

我當然可以使用繼承來實現這個簡單的示例,但這僅適用於以這種方式實現單個協議。 我建議的這種方法是否自然而然,或者是hack?

創建一個實現協議的類,即。 SelectableObject ,然后使WidgetDuhicky類繼承SelectableObject。

聽起來您想要像Ruby中的Mixin之類的東西。 不幸的是,這在Objective-C的語言級別上是不可能的。 共享行為的唯一方法是通過繼承。

就是說,您可以使用Objective-C運行時完成一些技巧,以實現所需的目標。 反對使用您使用的語言可能不是一個好主意,但是如果您想探索此選項,請在此處查看: http : //cocoadev.com/wiki/MethodSwizzling

遺憾的是,這是繼承特別不適用於該問題的情況之一。

但是,您可以在Cocoa框架( NSResponderUIResponder )中看到這種繼承濫用 如果您不控制繼承結構(外部框架中的某些對象)而需要使對象成為可選對象,則會遇到問題。

您在NSObject上的類別將起作用,在這種情況下,我認為它是可取的。 乍一看,似乎每個對象都很難處理這些方法,但是由於方法查找機制中存在緩存,因此性能損失很小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM