2012-02-22 25 views
7

Đối với trường hợp đối tượng chúng ta có thể có lớp học của họ tuyên bố một số phù hợp giao thức như trong:ObjC: có một thứ như một "giao thức lớp" không?

@protocol P <NSObject> 
- (void) someMethod ; 
@end 

@interface C : NSObject <P> 
@end 

@implementation C 
- (void) someMethod { 

} 
@end 

Nhưng những gì về lớp học?

tôi thấy mình trong tình huống này:

... 
Class c = [self modelClass:kind] ; 
if (c) { 
    model = [c performSelector: @selector(decode:) 
        withObject: [SExpIO read: [fm contentsAtPath:target]]] ; 
} 

và tôi muốn có một cách để tôi tuyên bố rằng có một điều như các giao thức cho các phương pháp lớp.

Trong ví dụ trên, tất cả các lớp học mà c có thể là một lớp sơ thẩm (Hmmm ??) của, kê khai

+ (id) decode: (SExp *) root ; 

Có cách nào mà tôi có thể chuyển đổi trên vào:

if (c) { 
    model = [c decode: [SExpIO read: [fm contentsAtPath:target]]] 
} 

bằng cách sử dụng tuyên bố "lớp giao thức" phù hợp?

Trả lời

7

những thứ như giao thức cho các phương pháp lớp học, và chúng được gọi là .... Protocols. Ví dụ, nó trông giống như bạn muốn có một giao thức trông như thế này:

@protocol MyDecoder 
+ (id)decode:(SExp *)root; 
@end 

Sau đó, bạn có thể sử dụng nó như thế này:

Class c = [self modelClass:kind]; 
if ([c conformsToProtocol:@protocol(MyDecoder)]) { 
    model = [c decode: [SExpIO read: [fm contentsAtPath:target]]]; 
} 
+0

Tuyệt vời! Cảm ơn – verec

9

Giao thức chỉ là danh sách các khai báo phương thức. Chúng có thể là các phương thức lớp hoặc các phương thức thể hiện. Ví dụ:

@protocol MyProtocol 

+ (id) aClassMethod; 
+ (void) someOtherClassMethod; 
- (void) someInstanceMethod; 

@end 
+0

Không biết bạn có thể làm điều đó ... gọn gàng. – Steve

+0

Wow! Tôi không mong đợi điều đó! Cảm ơn!! Tôi đã thử và nó thậm chí biên dịch, nhưng tôi bối rối: cho rằng Lớp c = [tự modelClass: loại]; thực sự là một cách vòng vo để nói Lớp c = NSClassFromString (@ "SomeClassThatIndeedImplementsModel"); cách biên dịch này hoàn toàn: nếu (c) { mô hình = [c giải mã: [SExpIO đọc: [fm contentsAtPath: target]]]; } "Lớp" của chính nó không có bất kỳ thông tin loại nào, có vẻ như? – verec

+0

Các lớp là các đối tượng trong Objective-C. Các lớp có các lớp meta, cũng là các đối tượng: 'typedef struct objc_class * Class; typedef struct objc_object { Lớp isa; } * id; ' –

Các vấn đề liên quan