2010-09-20 20 views
10

Tôi sẽ đánh giá cao nếu có ai có thể giải thích logic đằng sau sự thừa kế giao thức. ví dụ. ý nghĩa sau đây là gì (UITableView.h):Hiểu về sự thừa kế giao thức trong mục tiêu-C

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 

Việc triển khai lớp sau không hoạt động. Tôi có một lớp View1 (kế thừa UIView), với một giao thức liên quan. Tôi có một lớp khác, View2 (trong đó hít vào View1). Bây giờ tôi muốn kế thừa giao thức là tốt. Bất cứ ai có thể xin vui lòng chỉ cho tôi đi đúng hướng.

Lớp 1:

@protocol View1Delegate; 

@interface View1 : UIView { 
    id <View1Delegate> delegate; 
    // . . . 
} 

@property (nonatomic, assign) id <View1Delegate> delegate; // default nil. weak reference 

@end 

@protocol View1Delegate <NSObject> 
- (void)View1DelegateMethod; 
@end 

@implementation View1 

@synthesize delegate; 

// . . . 
@end 

Lớp 2:

@protocol View2Delegate; 

@interface View2 : View1 { 
    id <View2Delegate> delegate; 
    // . . . 
} 

@property (nonatomic, assign) id <View2Delegate> delegate; // default nil. weak reference 

@end 

@protocol View2Delegate <NSObject> 
- (void)View2DelegateMethod; 
@end 

@implementation View2 

@synthesize delegate; 

// . . . 
@end 

Trả lời

11

Hãy suy nghĩ về nó nhiều hơn như thành phần chứ không phải là thừa kế.

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> xác định giao thức bao gồm tất cả các phương thức của giao thức NSObject, giao thức UIScrollViewDelegate, cũng như bất kỳ phương thức nào được xác định cho giao thức UITableViewDelegate. Khi bạn phân lớp và tạo thuộc tính mới, bạn sẽ ghi đè loại thuộc tính superclasses. Để thực hiện công việc này theo cách tôi nghĩ bạn muốn, bạn nên khai báo View2Delegate@protocol View2Delegate <NSObject, View1Delegate>.

+1

Cảm ơn bạn đã trả lời của bạn. Tôi tuyên bố giao thức như bạn đã đề cập, nhưng vấn đề tôi đang phải đối mặt là với tuyên bố của id <...> đại biểu; Trong View1, tôi có id delegate; với liên kết @property và @synthesize. Vì tôi đang kế thừa View1 trong View2, khi tôi khai báo id delagete; với nó được liên kết @property và @synthesize, tôi nhận được một lỗi: "Thuộc tính 'đại biểu' cố gắng sử dụng ivar 'đại biểu' tuyên bố trong lớp siêu của 'View2'. Cách chính xác để xử lý tình huống này là gì. đã đăng ở trên. – Mustafa

0

Đó là chính xác giống như các thừa kế của giao diện trong Java (interface UITableViewDelegate extends NSObject, UIScrollViewDelegate), C# (interface UITableViewDelegate : NSObject, UIScrollViewDelegate) vv

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