2009-07-03 15 views
11

Hãy xem xét một bản sao đúng nguyên văn của mẫu Builder Bloch (với những thay đổi được thực hiện cho cú pháp C# 's):Tại sao không Builder làm việc mẫu của Bloch trong C#

public class NutritionFacts 
{ 
    public int ServingSize { get; private set; } 
    public int Servings { get; private set; } 
    public int Calories { get; private set; } 
    ... 
    public class Builder 
    { 
    private int ServingSize { get; set; } 
    private int Servings { get; set; } 
    private int Calories { get; set; } 

    public Builder(int servingSize, int servings) 
    { 
     ServingSize = servingSize; 
     Servings = servings; 
    } 

    public Builder Calories(int calories) 
    { Calories = calories; return this; } 

    public NutritionFacts Build() 
    { 
     return new NutritionFacts(this); 
    } 
    } 

    private NuitritionFacts(Builder builder) 
    { 
    ServingSize = builder.ServingSize; 
    Servings = builder.Servings; 
    Calories = builder.Calories; 
    } 
} 

Nếu bạn cố gắng chạy này, biên dịch C# sẽ phàn nàn rằng nó không có quyền truy cập vào các thuộc tính riêng của Builder. Tuy nhiên, trong Java, bạn có thể làm điều này. Quy tắc nào khác trong C# ngăn cản bạn truy cập các thuộc tính riêng tư của các lớp lồng nhau?

(Tôi nhận ra rằng mọi người đã đưa ra lựa chọn thay thế here và điều đó thật tuyệt. Tôi quan tâm là lý do bạn không thể sử dụng mẫu Java mà không sửa đổi).

+0

Xin chào, tôi đã hỏi câu hỏi chính xác này.Got một số câu trả lời khá hay. Ở đây chúng tôi đi [http://stackoverflow.com/questions/512651/how-is-javas-notion-of-static-different-from-cs](http://stackoverflow.com/questions/512651/how-is -javas-notion-of-static-different-from-cs) – uriDium

Trả lời

18

Trong các thành viên riêng tư của các lớp bên trong/lồng nhau có thể truy cập được vào lớp chứa. Trong C# thì không.

+1

Trình biên dịch cho phép điều này bằng cách tạo ra các trình truy cập tổng hợp với các điều khoản thích hợp. Xin lỗi vì đã hồi sinh một chuỗi cũ ... – Jonathan

+0

@ Jonathan: Vâng, đó là sự thật. Điều này phải làm với thực tế là JVM không thực sự biết về các lớp lồng nhau, và vì vậy các phương thức tổng hợp là cần thiết để có được hành vi mong muốn. Ấn tượng của tôi là câu hỏi về ngôn ngữ Java, không phải là JVM. –

+1

Chính xác. Tôi chỉ cố gắng cung cấp thêm thông tin, trong trường hợp bất cứ ai tình cờ gặp phải điều này trong tương lai. – Jonathan

3

Tôi không thấy lý do tại sao nên được phép biên dịch. Bạn đang cố truy cập các trường riêng tư của một lớp từ bên ngoài lớp đó. Java, tuy nhiên, có một quy tắc đặc biệt cho các lớp lồng nhau cho phép truy cập từ lớp bên ngoài.

2

Mức khả năng tiếp cận trong C# như sau:

  • công cộng: Truy cập không hạn chế.
  • được bảo vệ: Quyền truy cập bị giới hạn ở lớp có chứa hoặc các loại có nguồn gốc từ lớp chứa.
  • nội bộ: Quyền truy cập được giới hạn trong hội đồng hiện tại.
  • nội bộ được bảo vệ: Quyền truy cập bị giới hạn ở phiên bản hiện tại hoặc các loại có nguồn gốc từ lớp chứa.
  • riêng: Quyền truy cập được giới hạn ở loại có chứa.

Không có trường hợp đặc biệt nào trong C# cho lớp lồng nhau, do đó bạn không thể truy cập thành viên riêng từ bên ngoài lớp học đó hoặc bất kỳ lớp học nào xuất phát từ lớp đó.

Bạn có thể tìm thêm thông tin trong bài viết theo MSDN: "quy tắc subsumption các hệ thống kiểu cho ngôn ngữ OO" Accessibility Levels (C#)

+0

Sự hiểu biết của tôi là có một loại trường hợp đặc biệt cho C# lớp lồng nhau. Họ có thể truy cập các loại tư nhân kèm theo. –

0

Gilad Bracha argues rằng việc cho phép các lớp bên ngoài truy cập vào các lối đi riêng của lớp vỡ lồng nhau

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