2008-12-11 18 views
6

tôi nhìn thấy một số mã tôi đã thừa hưởng mà trông giống như sau:sử dụng loại trong Objective-C

@interface SomeClass (private) 

này nằm SomeClass.m, tập tin thực hiện. Có một tệp tiêu đề đi kèm không đề xuất rằng lớp đang sử dụng một danh mục. Có phải (private) trong trường hợp này chỉ là một cái tên không đúng với một danh mục cho SomeClass? Và tôi cho rằng nó hoàn toàn hợp pháp để xác định các loại như vậy trong một thực hiện?

Trả lời

31

Đó không phải là tên "riêng tư" làm cho riêng tư; các phương thức là riêng tư bởi vì chúng nằm trong một thể loại được khai báo bên trong tệp triển khai.

Có ba công dụng của một loại, mỗi trong số đó thêm các phương pháp để một lớp học (lưu ý: phương pháp duy nhất, không Ivars)

Mở rộng một lớp Cocoa hiện

này cho phép bạn thêm của riêng bạn các phương thức cho một lớp hiện có. Ví dụ: Ví dụ: nếu bạn muốn mở rộng NSString để áp dụng cách viết hoa đặc biệt, bạn có thể tạo một lớp mới có tên là NSString + Capitals. trong NSString + Capitals.h bạn sẽ phải:

@interface NSString (Capitals) 

-(NSString *)alternateCaps:(NSString *)aString; 

@end 

và trong NSString + Capitals.m bạn sẽ thực hiện các phương pháp

@implementation NSString (Capitals) 
-(NSString *)alternateCaps:(NSString *)aString 
{ 
    // Implementation 
} 

phương pháp cá nhân trên một lớp

Đây là tương tự như trên, ngoại trừ các phương thức bổ sung được khai báo và xác định trong tệp triển khai (.m) Thông thường một cách có phương thức riêng - vì chúng không nằm trong tệp .h (là tệp #imported bởi các lớp khác) họ đơn giản là không có thể nhìn thấy. Trong trường hợp này, việc thực hiện các phương thức được thực hiện trong khối thực hiện riêng của chúng. ví dụ

// someClass.m 
@interface someClass (extension) 
-(void)extend; 
@end 

@implementation someClass 
    // all the methods declared in the .h file and any superclass 
    // overrides in this block 
@end 

@implementation someClass (extension) 
-(void)extend { 
    // implement private method here; 
} 

Lớp mở rộng (mới cho 10.5 Leopard)

Một cách đơn giản của việc có phương pháp riêng. Trong trường hợp đặc biệt này, tên danh mục trống và các phương thức riêng được triển khai trong cùng một khối với tất cả các phương thức lớp khác.

// someClass.m 
@interface someClass() 
-(void)extend; 
@end 

@implementation someClass 
    // all the methods declared in the .h file and any superclass 
    // overrides in this block 
    // Implement private methods in this block as well. 
-(void)extend { 
    // implement private method here; 
} 

@end 

Đây là tài liệu của Apple trên Danh mục và tiện ích mở rộng.

+0

Tôi không đồng ý rằng bạn nên trộn các phương thức riêng tư (danh mục) với việc triển khai thường xuyên của bạn. Đó là vấn đề về phong cách, nhưng tôi muốn duy trì sự tách biệt rõ ràng. –

+0

Cần lưu ý rằng việc tiếp tục lớp (những gì bạn gọi là một phần mở rộng lớp) là mới trong Leopard. –

+0

@Peter. Cảm ơn bạn đã chỉ ra điều đó. @Marc. Trong trường hợp danh mục trống, các phương thức phải được triển khai trong khối chính. Tuy nhiên, khi sử dụng phương pháp thứ hai, tôi đồng ý rằng đó là phong cách tốt hơn để đặt triển khai danh mục trong khối của riêng họ. – Abizern

2

"Riêng tư" chỉ là tên cho thấy các phương pháp không công khai và được sử dụng cho việc triển khai nội bộ của lớp, nhưng không có gì trong khai báo danh mục thực thi điều đó.

Ngoài ra, các phương thức được xác định trong danh mục sẽ được thêm vào định nghĩa lớp khi chạy, do đó tệp tiêu đề đi kèm không cần khai báo rằng nó đang sử dụng danh mục - nó được tự động "sử dụng".

2

Tôi sử dụng điều đó để cung cấp cho tôi một nơi nào đó để khai báo (và do đó tài liệu, cũng như đóng trình biên dịch lên) các phương thức trợ giúp không cần phải ở trong giao diện công cộng. Sau đó, "người tiêu dùng" của lớp là (ngầm, cho rằng không có gì ngăn cản chúng ngoài cách cư xử tốt) bị hạn chế sử dụng các phương thức được xác định trong tệp tiêu đề.

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