2010-03-04 26 views

Trả lời

3

"Danh mục" cho phép bạn thêm phương pháp chứ không phải biến thành viên, cho các lớp hiện có.

Xem phần hướng dẫn này trên chúng (tìm kiếm trong trang): http://cocoadevcentral.com/d/learn_objectivec/ Hoặc tra cứu Danh mục trong tài liệu Mục tiêu-C ở bất kỳ nơi nào khác.

Bạn không thể thêm vars mẫu mà không có phân lớp phụ.

+1

Bạn có thể thêm một cái gì đó giống như các biến mẫu thông qua các tham chiếu liên kết (như Laurent trỏ tới). – bbum

0

Bạn có thể thêm các phương thức thành viên vào một lớp không có phân lớp bằng cách tạo danh mục, nhưng điều này sẽ không cho phép bạn thêm các biến thành viên.

Mặc dù rất nhiều thứ có thể được thực hiện khi chạy trong mục tiêu-c không thể thực hiện bằng các ngôn ngữ khác (xem runtime reference) Tôi thực sự không đề xuất nhiều hackery này để thêm biến mẫu vào lớp hiện có.

Bạn có thể giải thích lý do bạn không muốn phân lớp không? Một phân lớp hoặc thể loại thực sự có vẻ như là điều tốt nhất để làm.

6

Đối với các phương pháp: bạn có thể sử dụng categories để thêm các phương thức thành viên mà không cần phân lớp phụ. Đó là một thực tế khá phổ biến trong Cocoa, để thêm phương pháp mở rộng cho mỗi khung công tác.

Đối với các biến mẫu: bắt đầu bằng Snow Leopard (Mac OS X 10.6), bạn có thể sử dụng associative references. Bạn sử dụng chúng để mô phỏng việc bổ sung các biến đối tượng cho một lớp hiện có.

Objective-C Programming Language là khá toàn diện về những gì bạn có thể làm với cả hai tham chiếu và danh mục liên kết.

1

Bạn không thể. Đôi khi nó là một ý tưởng tồi để phân lớp (có thể bạn đang làm việc với một cụm lớp, ví dụ), vì vậy mọi người thường làm việc xung quanh điều này bằng cách tạo ra một lớp mới (một lớp con của NSObject, không phải của lớp được đề cập). biến thể hiện có loại là lớp được đề cập, cũng như các biến được thêm vào mong muốn.

Ví dụ, nếu bạn muốn tạo ra một lớp con của NSString với một BOOL bổ sung được gọi "foo" ...

@interface StringWithFoo : NSObject 
{ 
    NSString* string; 
    BOOL foo; 
} 

... và sau đó thực hiện bất kỳ phương pháp bạn cần, hoặc tạo ra một accessor công cộng vì vậy bạn có thể gọi các phương thức trên chuỗi trực tiếp hoặc thậm chí sử dụng thủ thuật thời gian chạy ưa thích để chuyển tiếp thư một cách thích hợp (hỏi một câu hỏi mới nếu đó là những gì bạn muốn làm).

Đây là một ví dụ về decorator pattern.

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