2012-03-19 28 views
7

Trong phân lớp một lớp, tôi cũng muốn phân lớp một đại biểu của lớp cha cho rằng lớp con bây giờ có chức năng bổ sung. Cách tốt nhất để làm gì? Nếu tôi chỉ cần khai báo một tài sản đại biểu trong lớp con có cùng tên tôi sẽ nhận được một cảnh báo "Loại tài sản 'id' là không tương thích với kiểu 'id' thừa hưởng từ 'ParentClass'Làm thế nào để phân lớp đúng thuộc tính đại biểu trong Objective-C?

Trả lời

1

Thực hiện theo các ví dụ về NSTableViewNSOutlineView.

NSOutlineView là một lớp con của NSTableView, và định nghĩa giao thức riêng của mình cho dataSourcedelegate

NSTableView tuyên bố đại biểu của nó theo cách này:.

- (void)setDelegate:(id <NSTableViewDelegate>)delegate; 
- (id <NSTableViewDelegate>)delegate; 

NSOutlineView:

- (void)setDelegate:(id <NSOutlineViewDelegate>)anObject; 
- (id <NSOutlineViewDelegate>)delegate; 

Rõ ràng trình biên dịch là khoan dung hơn với khai báo phương thức trần hơn là với tờ khai tài sản.

Không giống như NSTable/OutlineView, bạn có thể muốn thực hiện kế thừa giao thức của lớp con từ giao thức lớp cơ sở của, ví dụ

@protocol SpecializedProtocol <BaseProtocol> 

... nó có thể phụ thuộc vào tình huống.

+0

tôi đã đi với con đường thứ hai (phân lớp giao thức đại biểu sau khi lớp con của lớp chính), nhưng không thể tuyên bố một tài sản đại biểu mà không gây ra lỗi biên dịch. Là phương pháp khai báo bạn đề cập đến cách duy nhất để làm cho trình biên dịch hạnh phúc? – Boon

+0

Tôi không biết cách nào khác để làm điều đó. –

15

Với ví dụ này là tạo ra cảnh báo:

// Class A 
@protocol ClassADelegete; 

@interface ClassA : NSObject 
@property (nonatomic, weak) id<ClassADelegete> delegate; 
@end 

@protocol ClassADelegete <NSObject> 
- (void)classADidSomethingInteresting:(ClassA *)classA; 
@end 

// Class B 
@protocol ClassBDelegete; 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassBDelegete> delegate; // Warning here 
@end 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

Hai giải pháp loại bỏ các cảnh báo đang có.

1) Trong lớp con, đặt định nghĩa giao thức trước khi định nghĩa lớp. Đây là những gì UITableViewDelegate trong UITableView.h làm:

// Class B 
@class ClassB; 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassBDelegete> delegate; 
@end 

2) Trong lớp con, thêm giao thức gốc bên cạnh mới:

// Class B 
@protocol ClassBDelegete; 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassADelegete, ClassBDelegete> delegate; 
@end 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

tôi giả (1) hoạt động như Apple làm theo cách này, Tùy chọn (2) loại bỏ các cảnh báo nhưng tôi đã không biên soạn và chạy bất cứ điều gì thiết lập theo cách này.

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