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
Thực hiện theo các ví dụ về NSTableView
và NSOutlineView
.
NSOutlineView
là một lớp con của NSTableView, và định nghĩa giao thức riêng của mình cho dataSource
và delegate
nó
NSTableView
tuyên bố đại biểu của nó theo cách này:.
- (void)setDelegate:(id <NSTableViewDelegate>)delegate;
- (id <NSTableViewDelegate>)delegate;
và 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.
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.
- 1. Làm thế nào để thẩm vấn các thuộc tính phương thức thông qua một đại biểu?
- 2. Làm thế nào để xác định đúng các thuộc tính lớp?
- 3. Làm cách nào để tạo đại biểu cho thuộc tính .NET?
- 4. Làm thế nào để đại diện cho văn bản để phân loại trong weka?
- 5. làm thế nào để phân tích giá trị trong thuộc tính trong xml phân tích
- 6. Làm thế nào để chuyển đổi đại biểu cho đại biểu giống hệt nhau?
- 7. Hiệu suất phản chiếu - Tạo đại biểu (Thuộc tính C#)
- 8. Cách tạo lớp, phân lớp và thuộc tính trong Lua?
- 9. Làm thế nào để có được Active Directory Các thuộc tính không được đại diện bởi lớp UserPrincipal
- 10. Làm thế nào để cho màu sắc cho mỗi lớp trong ô phân tán trong R?
- 11. Làm thế nào để xử lý nhiều đại biểu
- 12. Làm thế nào để thêm các thuộc tính để tính một lớp cơ sở của
- 13. Làm thế nào để liên hiệp một Lambda Đại biểu
- 14. Làm thế nào để đúng phân lớp dict và ghi đè __getitem__ & __setitem__
- 15. Làm thế nào để đại biểu từ khóa làm việc so với việc tạo một đại biểu
- 16. Làm thế nào để phân lớp UIApplication?
- 17. Làm thế nào để thêm thuộc tính lớp để chọn thẻ trong đường ray 3
- 18. Làm thế nào để "siêu" của Python làm điều đúng?
- 19. Đặt tên thuộc tính, làm cách nào tôi có thể tạo đại biểu để nhận giá trị
- 20. Làm thế nào để phân lớp chính xác CALayer và sử dụng một thuộc tính tùy chỉnh?
- 21. Làm thế nào để thêm một đại biểu táo vào một danh sách các đại biểu hoa quả?
- 22. Làm thế nào để tài liệu thuộc tính của lớp trong PHP 5 với phpDocumentor
- 23. Làm thế nào để ghi đè lên một thuộc tính lớp kế thừa trong C#?
- 24. Làm thế nào để bạn tổ chức các phương thức và thuộc tính trong một lớp?
- 25. Làm cách nào để triển khai đúng thuộc tính trong F #?
- 26. Filehelpers Phân tích cú pháp CSV. Làm thế nào để sử dụng thuộc tính FieldQuoted?
- 27. Làm thế nào để sử dụng MKMapView tải xong đại biểu, có thể "hoàn thành hiển thị" đại biểu?
- 28. Làm thế nào để thực hiện mẫu đại biểu (như trong mục tiêu-c) trong java
- 29. XPath ký tự đại diện trong giá trị thuộc tính
- 30. Cách đặt đại biểu trong một lớp khác
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
Tôi không biết cách nào khác để làm điều đó. –