2009-02-22 47 views
12

Nếu bạn có Class A với một cá thể var "foo" có chỉ thị @ property/@ synthesize và lớp B kế thừa từ lớp A, nó cũng cần @ tài sản/@ tổng hợp "foo"? Lý do tôi hỏi là bởi vì khi tôi cố gắng sử dụng "foo" của lớp B, lớp gọi nói rằng "foo" không phải là một công đoàn có cấu trúc hay thành viên, điều đó khiến tôi tin rằng nó cần được tổng hợp một cách rõ ràng.Sử dụng thuộc tính @ synthesize/@ trong kế thừa Objective-C

+0

Có, vì giao diện là thứ gì đó dọc theo dòng: @interface ClassB: ClassA, bạn cần #import ClassA.h – Coocoo4Cocoa

+5

Bạn đang ở trên chương 8, phải không? – willc2

+0

bạn cần nhập vào tệp tiêu đề lớp B - không chuyển tiếp khai báo lớp A và nhập vào .m – gheese

Trả lời

10

Không, bạn không. Thuộc tính tổng hợp được thêm vào lớp A và các lớp con của nó một cách tự động.

+0

@Georg: Downvote là của tôi, nhưng tôi đảm bảo với bạn nó không phải là cố ý! Tôi đã vô tình bấm vào mũi tên xuống, và bây giờ lá phiếu là "quá cũ để thay đổi". Nếu bạn có thể thực hiện một chỉnh sửa nhỏ, tôi sẽ vui vẻ chuyển nó thành một bài viết tuyệt vời (đó là những gì tôi định làm ngay từ đầu). –

+0

@ e.James: xong. :) –

+4

Cảm ơn. Đó là trọng lượng lương tâm của tôi! :) –

1

Khi kế thừa bạn không cần phải thực hiện lại bất kỳ thuộc tính hoặc biến nào.

Có lẽ nếu bạn đăng tệp tiêu đề ClassB hoặc một phần thì mọi người có thể xác định chính xác hơn vấn đề của bạn.

10

Nếu bạn có lớp A với một thể hiện var "foo" có chỉ thị @ property/@ synthesize và lớp B kế thừa từ loại A, nó cũng cần @ property/@ synthesize "foo"?

số

Lý do tôi hỏi là bởi vì khi tôi cố gắng sử dụng "foo" Class B, lớp gọi điện thoại nói ...

Không, trình biên dịch cho biết.

… rằng "foo" không phải là một công đoàn có cấu trúc hoặc thành viên, điều này khiến tôi tin rằng nó cần được tổng hợp một cách rõ ràng.

Có. Trong lớp A.

Trình biên dịch cung cấp cho bạn cảnh báo đó vì nó không biết về @property, đó là vì bạn chưa khai báo và nhập một tiêu đề khai báo nó. Bạn nói rằng tiêu đề của lớp A khai báo thuộc tính, do đó, hãy nhập tiêu đề của lớp A vào thực thi lớp B, để trình biên dịch biết về thuộc tính khi biên dịch lớp B.

4

Chỉ trong trường hợp điều này giúp người khác.

Tôi cũng đã xem xét vấn đề này và đọc những câu trả lời này và vẫn không thể truy cập trực tiếp vào các biến siêu lớp. Chúng được khai báo là thuộc tính và được tổng hợp trong lớp siêu và tôi đã nhập tiêu đề vào lớp con của tôi. Tôi đã bị mắc kẹt cho đến khi tôi phát hiện ra tôi cần khai báo các biến thành viên trong phần @interface trong lớp siêu cũng như thuộc tính của lớp cha ....! ví dụ.

@interface BuoyAnnotation : NSObject <MKAnnotation> 
{ 
    CLLocationCoordinate2D coordinate; 
    CLLocation* location; 
    int type; 

} 

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 
@property (nonatomic, retain) CLLocation* location; 
@property (nonatomic, assign) int type; 
0

Đúng, bạn chỉ cần khai báo @property bên ngoài dấu ngoặc nhọn khai báo biến thành viên và sau đó @synthesize thuộc tính trong tệp .m. Tôi đã nhận thấy rằng trong lớp con bạn đã sử dụng self.propertyName để tham chiếu nó nhưng trong lớp cha bạn chỉ có thể sử dụng tên biến tức thời.

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