2011-07-20 23 views
5

Các công trình sau đây trong C#:Tại sao một thuộc tính thực hiện trong VB.NET phải khớp với các chỉ số 'ReadOnly' phù hợp?

interface I 
{ 
    int X { get; } 
} 

class C : I 
{ 
    public int X 
    { 
     get { ... } 
     set { ... } 
    } 
} 

Sau đây không hoạt động trong VB.NET:

Interface I 
    ReadOnly Property X As Integer 
End Interface 

Class C 
    Implements I 

    Public Property X As Integer Implements I.X 
     Get 
      ... 
     End Get 
     Set(value As Integer) 
      ... 
     End Set 
    End Property 
End Class 

Thông báo lỗi Implementing property must have matching 'ReadOnly' or 'WriteOnly' specifiers là khá tự giải thích, vì vậy tôi biết có gì sai ở đây. Nó cũng không phải là một vấn đề lớn, bởi vì nó khá dễ dàng để làm việc xung quanh giới hạn này.

Tôi tò mò, mặc dù: Có ai biết tại sao các nhà thiết kế VB quyết định xử lý trường hợp này khác với C#?

+0

Tôi không thấy người đọc chỉ đọc trên thuộc tính của bạn trong phiên bản C của giao diện? – Nikki9696

+0

@ Nikki9696: Việc thiếu một setter trong phiên bản C# là tương đương, về cơ bản. –

+0

@ Nikki9696 Điều đó được ngụ ý. Sự khác biệt là nó không cần thiết. Nhưng, Heinzi, bạn xác định rõ ràng nó trong phiên bản giao diện VB.NET, vì vậy đó là một sự khác biệt khá lớn. –

Trả lời

3

Tôi không chắc chắn về phía VB, nhưng với việc thực hiện giao diện rõ ràng của IX trong C# bạn cũng sẽ nhận được đơn khiếu nại về các setter thêm:

interface I 
{ 
    int X { get; } 
} 

class C : I 
{ 
    int I.X // explicit implementation of I.X 
    { 
     get { return 1; } 
     set { } 
    } 
} 

Bạn nhận được một lỗi tương tự trong C# . Đối với VB, có thể muốn kiểm tra này SO chủ đề: If an interface defines a ReadOnly Property, how can an implementer provide the Setter to this property?

+0

+1, điểm rất tốt! – Heinzi

+0

Thật không may, mặc dù, tôi không phải là một anh chàng VB vì vậy tôi đang chơi với VB để xem làm thế nào để làm điều tương tự như ví dụ C# đầu tiên của bạn ... –

+1

Hình như một người nào khác có vấn đề này, xem: http://stackoverflow.com/questions/6307335/if-an-interface-defines-a-readonly-property-how-can-an-implementer-provide-the-s –

0

Bạn có ReadOnly trên tài sản trong Interface I nhưng không phải trong thừa hưởng Class C nên chữ ký tài sản không phù hợp, do đó lỗi. Tôi chắc rằng bạn không thể thêm một người truy cập set vào một tài sản ReadOnly.

+0

Câu hỏi đặt ra là tại sao bạn không thể sử dụng thuộc tính không chỉ đọc để triển khai giao diện chỉ muốn có trình thu thập dữ liệu. – CodesInChaos

1

Bạn cần cung cấp thuộc tính chỉ đọc để triển khai I.X; nếu bạn muốn YourClass.X trở thành một tài sản đọc-ghi, thì chỉ đọc mà thực hiện IX nên được đặt tên khác (ví dụ

 
    Public Property Xreadonly As Integer Implements I.X 

Tôi không khá chắc chắn tại sao Net đòi hỏi việc sử dụng ba các loại thuộc tính (chỉ đọc, chỉ ghi và đọc), thay vì chỉ đơn giản cho phép một đối tượng khai báo thuộc tính chỉ đọc và thuộc tính chỉ ghi được sử dụng như thể nó có thuộc tính đọc-ghi, Có lẽ bởi vì họ muốn đảm bảo rằng việc ghi đè lên getter sẽ đi theo cùng một đường dẫn thừa kế như một ghi đè của một setter, nhưng có vẻ như có những trường hợp liên quan đến getters và setters như các mục riêng biệt sẽ hữu ích hơn (trong một số trường hợp, ví dụ, có thể hữu ích khi có thuộc tính Nhận phương thức trả về một loại khác biệt, nhưng có thể cưỡng chế, Đặt loại phương thức; hoặc nó có thể hữu ích để có nhiều quá tải của Set; không được phép trong .net, mặc dù).

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