2009-10-17 31 views
12

tôi đã đọc làm thế nào để thực hiện các phương pháp tư nhân trong Objective-C (Best way to define private methods for a class in Objective-C) và một câu hỏi hiện lên trong tâm trí tôi:phương pháp cá nhân sử dụng thể loại trong Objective-C: gọi siêu từ một lớp con

Làm thế nào để bạn quản lý thế nào để thực hiện các phương thức được bảo vệ, tức là các phương thức riêng có thể thấy được với các lớp con?

Giả sử tôi có MySuperClass với Danh mục chứa tất cả các phương thức riêng tư của nó và tôi muốn triển khai ghi đè MySubclass hoặc gọi siêu cho một trong các phương thức riêng tư MySuperClass. Điều đó có khả thi không (bằng cách sử dụng phương pháp Categories để thực hiện các phương thức riêng)?

Hãy xem một số mã này, ở dưới cùng có phương pháp được ghi đè.

// =========================== 
// = File: MySuperClass.h 
// = Interface for MySuperClass 
// =========================== 

@interface MySuperClass : Object 
... 
@end 

// =========================== 
// = File: MySuperClass.m 
// =========================== 
#import "MySuperClass.h" 

// ================================= 
// = Interface for Private methods 
// ================================= 
@interface MySuperClass (Private) 

-(void) privateInstanceMethod; 

@end 

// ===================================== 
// = Implementation of Private methods 
// ===================================== 
@implementation MySuperClass (Private) 

-(void) privateInstanceMethod 
{ 
    //Do something 
} 

@end 

// ================================ 
// = Implementation for MySuperClass 
// ================================ 
@implementation MySuperClass 
... 
@end 




// =========================== 
// = File: MySubClass.h 
// = Interface for MySubClass 
// =========================== 

@interface MySubClass : MySuperClass 
... 
@end 


// ================================ 
// = Implementation for MySubClass 
// ================================ 

#import MySubClass.h 

@implementation MySubClass 
//OVERRIDING a Super Private method. 
-(void) privateInstanceMethod 
{ 
    [super privateInstanceMethod]; //Compiler error, privateInstanceMethod not visible! 
    //Do something else 
} 
@end 

Hy vọng rằng ai đó đã tìm ra điều này.

Chúc mừng!

+0

"May mắn là có ai đó đã tìm ra điều này." ... Vậy bạn đang hỏi gì? –

+0

Sự nhầm lẫn ngôn ngữ, tôi nghĩ vậy. Đã sửa. – nall

+1

Cảm ơn bạn đã không làm cho câu hỏi của tôi dễ dàng hơn cho mọi người hiểu. Tôi đã mắc sai lầm khi sử dụng từ "may mắn" khi tôi thực sự có nghĩa là "hy vọng". Xin lỗi và cảm ơn bạn rất nhiều! – Lio

Trả lời

13

This GNUStep page mô tả một cách tiếp cận Phần 4.5:

... Các mặt tích cực của việc này là nó cho phép bạn mô phỏng bảo vệ phương pháp là tốt. Đối với điều này, các nhà văn của một phân lớp phải được thông báo trong một số cách về các phương pháp được bảo vệ, và họ sẽ cần phải đưa lên với các cảnh báo trình biên dịch . Ngoài ra, bạn có thể khai báo danh mục được bảo vệ trong tệp giao diện riêng biệt (ví dụ: "PointProtected.h") và cung cấp tệp giao diện này với sự hiểu biết rằng nó chỉ được nhập và được sử dụng bởi tệp giao diện của lớp con .

+0

Đây là cách tôi làm điều đó. Chỉ cần đặt các khai báo phương thức trong một tiêu đề danh mục, nhưng thực hiện chúng trong khối thực hiện chính. Sau đó, các tệp cần biết về phương thức chỉ cần '# import' tiêu đề. –

+0

Tôi cảm ơn cả Dave và nall. Chúc mừng – Lio

13

Tại Apple, khi họ tạo khung, mẫu tiêu biểu là có tiêu đề công khai (MyClass.h) và tiêu đề riêng tư (MyClass_private.h) và chỉ sao chép tiêu đề công khai vào sản phẩm xây dựng. Tệp .m sẽ # import cả hai, tất nhiên.

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