2010-03-02 64 views
5

我們有接口,可以非常簡化爲:受保護設置在VB.Net中的接口定義的屬性

public interface IPersistable<T> 
{ 
    T Id { get; } 
} 

實現接口的大部分地方想擁有它,這樣是有保護或對財產,即私定,在C#:

public class Foo : IPersistable<int> 
{ 
    public int Id { get; protected set; } 
} 

但是,我不能讓任何樣品VB.Net代碼編譯遵循相同的模式,同時仍實現接口,所以:

Public Class Foo 
    Implements IPersistable(Of Integer) 

    Public Property Id() As Integer Implements IPersistable(Of Integer).Id 
     Get 
      Throw New NotImplementedException() 
     End Get 
     Protected Set(ByVal value As Integer) 
      Throw New NotImplementedException() 
     End Set 
    End Property 
End Class 

...不會編譯,但這:

Public Class Foo 
    Public Property Id() As Integer 
     Get 
      Throw New NotImplementedException() 
     End Get 
     Protected Set(ByVal value As Integer) 
      Throw New NotImplementedException() 
     End Set 
    End Property 
End Class 

我明白,這個例子是過於瑣碎,並且將可能通過保護構造可以更好地實現,但我有興趣,如果它可以以這種方式完成?

[編輯:] ...顯然,如果一個類型想要使用XMLSerialization,那麼這些屬性需要是公共讀/寫,或者這些類型需要爲每個類型編寫自定義串行器。

從本質上講,我發現界面應該定義最小的可訪問性,但VB將其解釋爲確切的可訪問性?

+1

+1在我注意到VBNET不允許之前,我遇到了同樣的情況。 – 2010-03-02 15:31:40

回答

6

是的,你必須逐字地實現接口。一個可能的解決方法是使用其他名稱重新發布的類屬性:

Public Class Foo 
    Implements IPersistable(Of Integer) 
    Private m_Id As Integer 

    Public ReadOnly Property Id() As Integer Implements IPersistable(Of Integer).Id 
    Get 
     Return m_Id 
    End Get 
    End Property 

    Protected Property IdInternal() As Integer 
    Get 
     Return m_Id 
    End Get 
    Set(ByVal value As Integer) 
     m_Id = value 
    End Set 
    End Property 
End Class 

財產申報可重寫,如果你打算重寫它的派生類。

+0

+1 VBNET不允許在屬性getter和setter中修改此屬性。您需要重新發布二傳手到另一個財產,或有權訪問您的私人領域,當然,這將有一個不同的私人修改。這是因爲接口需求在寫入時需要實現。所以,如果您將您的Id屬性標記爲公開,而不是將其提及爲ReadOnly,則必須同時設置Get和Set Public。 – 2010-03-02 15:31:05

+0

接受,因爲我現在發現這是一個願望清單項目:http://stackoverflow.com/questions/2362381/protected-set-in-vb-net-for-a-property-defined-in-an-interface/2365193#2365193 – 2010-03-02 17:26:54

1

該語言目前不支持該語言,在Visual Basic 10中也不支持(即Visual Studio 2010版本)。有一個wishlist item for exactly this。在此之前,nobugz提出的解決方法是唯一的選擇。

0

接口屬性只能通過匹配的類屬性實現。在vb.net和C#中都是如此。兩種語言的不同之處在於,如果具有相同名稱的公共讀寫屬性可用,則C#的隱式接口實現功能將自動定義只讀或只寫屬性以實現接口。

1

Visual Basic 14開始,你的第一個VB代碼示例編譯得很好。