Tôi muốn một phương thức cụ thể trong một lớp chỉ có thể truy cập được bởi một lớp cụ thể. Ví dụ:phương thức giới hạn chỉ được gọi bởi một lớp cụ thể
public class A
{
public void LimitedAccess() {}
public void FullAccess() {}
}
public class B
{
public void Func()
{
A a = new A();
a.LimitedAccess(); // want to be able to call this only from class B
}
}
public class C
{
public void Func()
{
A a = new A();
a.FullAccess(); // want to be able to call this method
a.LimitedAccess(); // but want this to fail compile
}
}
Có từ khóa hoặc thuộc tính mà tôi có thể sử dụng để thực thi việc này không?
UPDATE:
Do hạn chế về hệ thống phức tạp và thời gian tồn tại, tôi cần một giải pháp tác động thấp. Và tôi muốn một cái gì đó để chỉ ra tại thời gian biên dịch mà LimitedAccess() không thể được sử dụng. Tôi tin tưởng câu trả lời của Jon Skeet rằng chính xác những gì tôi đã yêu cầu không thể được thực hiện trong C#.
Câu hỏi và câu trả lời của Jon rất phù hợp với những người có thể chạy qua điều này sau. Và thực tế là mùi thiết kế này hy vọng có thể kéo dài bất cứ ai đi để lựa chọn một cái gì đó như thế này như một giải pháp mong muốn.
Như đã đề cập trong nhận xét, cuộc hội thoại C# friend là đọc hữu ích nếu bạn đang cố gắng giải quyết một tình huống tương tự.
Đối với giải pháp cụ thể của tôi: "tại sao A chứa logic B" (được hỏi bởi @sysexpand trong nhận xét). Đó là chà. B.Func()
được gọi là trong toàn bộ hệ thống mà tôi đang làm việc, nhưng nó chủ yếu hoạt động trên một singleton của A
. Vì vậy, những gì tôi đã kết thúc làm là di chuyển B
's Func()
vào A
và làm cho A.LimitedAccess()
riêng tư. Có một vài chi tiết khác để làm việc xung quanh, như mọi khi, nhưng tôi có một giải pháp tác động thấp đã cho tôi các lỗi biên dịch thời gian trên người gọi đến A.LimitedAccess()
.
Cảm ơn bạn đã thảo luận.
Tại sao bạn muốn thực hiện việc này? –
Tôi có một lớp lớn 'A' được sử dụng rộng rãi trong toàn bộ hệ thống. Lớp 'B' có các phụ thuộc khác nhưng có một cách tiêu chuẩn/tốt nhất để sử dụng B.LimitedAccess(). Tôi muốn thực thi bằng cách sử dụng 'B.Func()' bất cứ khi nào có thể. – jltrem
xem http://stackoverflow.com/questions/203616/why-does-c-sharp-not-provide-the-c-style-friend-keyword bạn nên đánh dấu 'LimitedAccess' là nội bộ và bắt lạm dụng của nó thông qua mã ôn tập. – Yaur