2009-08-27 28 views
19

Có cách nào để tạo thuộc tính như thuộc tính C# này trong Mục tiêu-C không?Tương đương mục tiêu-C của thuộc tính công cộng nhận/bảo vệ trong C#

public int prop { get; protected set;} 

Về cơ bản, tôi muốn có thể lấy giá trị từ bên ngoài lớp, nhưng chỉ có thể đặt giá trị từ bên trong lớp học.

+1

Thực tế được bảo vệ có ý nghĩa đặc biệt, điều đó cũng có nghĩa là các lớp dẫn xuất sẽ có quyền truy cập. –

+0

Được bảo vệ hoặc riêng tư sẽ hoạt động đối với tôi. :-) –

Trả lời

24

Cách dễ nhất để thực hiện điều này là để kê khai tài sản như readonly trong giao diện công cộng cho MyClass (tức là file .h):

@property (readonly) NSInteger prop; 

Sau đó, trong file .m cho lớp đó, khai báo một lớp extension (danh mục có tên trống). Trong phần mở rộng lớp, bạn có thể redeclare một @property thay đổi writeability của nó để ReadWrite:

@interface MyClass() 
@property (readwrite) NSInteger prop; 
@end 

@implementation MyClass 
@synthesize prop; 
... 
@end 

Tất nhiên, Objective-C không thực thi hạn chế truy cập, vì vậy không có gì ngăn chặn một số mã giả mạo từ gọi -[MyClass setProp:] là. Trình biên dịch sẽ gắn cờ đây là một cảnh báo, tuy nhiên, đó là tốt như bạn có thể nhận được trong Objective-C. Thật không may, không có cách nào tiêu chuẩn để ghi lại thuộc tính có thể ghi "được bảo vệ" này thành các lớp con; bạn sẽ phải giải quyết một quy ước cho nhóm của mình và đưa nó vào tài liệu công khai cho lớp nếu nó nằm trong một khung công tác mà bạn sắp phát hành.

+0

Không phải là 'readwrite' mặc định? Có cần phải xác định điều đó không? –

+0

@RaffiKhatchadourian, 'readwrite' là mặc định, nhưng trong phần mở rộng của lớp ghi đè một khai báo gốc' readonly', thì 'readwrite' là cần thiết. –

+0

@BarryWark - bạn sai về điều đó. Hãy thử nó và xem. Vì 'readwrite' là mặc định, nên redeclaring thuộc tính redeclares nó là' readwrite' theo mặc định. Đó là những gì nó có nghĩa là một mặc định. :) – matt

1

Tôi tin rằng bạn đang tìm kiếm các thuộc tính readonly trên @property

@property (readonly) NSInteger prop; 

Read more here.

+0

Nhưng sau đó không yêu cầu tôi truy cập vào giá trị đằng sau nó trực tiếp hơn là sử dụng tài sản? –

+0

yup, nếu bạn muốn đặt giá trị chỉ trong lớp thì bạn không thực sự cần phải sử dụng cú pháp self.prop ... bạn chỉ đơn giản là tham khảo trực tiếp. Thuộc tính chỉ đọc đảm bảo rằng bất cứ điều gì bên ngoài lớp học của bạn chỉ có thể nhận được giá trị nhưng không bao giờ thiết lập nó – keno

+0

Đây là một câu trả lời chưa hoàn chỉnh; bạn có thể redeclare các tài sản trong một phần mở rộng lớp học để làm cho nó readwrite. –

1

Không có cách nào để thực hiện các phương thức @ riêng tư/@ được bảo vệ trong ObjC, các trình biên dịch này chỉ áp dụng cho các biến mẫu. Tuy nhiên, bạn có thể khai báo một hàm C tĩnh trong cùng một tệp để có phương thức "@private".

Câu trả lời của keno có vẻ giống như cách chính xác nhất để đạt được điều này.

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