2013-10-05 37 views
3

在C#中的,有可能與此有關脫身:VB相當於C#「屬性挑釁」

interface IImpliedReadOnly 
{ 
int SomeNumber {get;} 
} 
class Implementation : IImpliedReadOnly 
{ 
private int someNumber = 0; 
public int SomeNumber {get{return someNumber;}set{someNumber=value;}} 
} 

但我不能找到一個等效的方式在VB中做到這一點。 如果我在接口ReadOnly中創建屬性,那麼實現類必須匹配這些訪問權限,並將屬性聲明爲ReadOnly,而不是像C#中那樣實現getter和setter。

有沒有辦法解決這個問題? 如果沒有,爲什麼VB不允許它?

回答

1

其實,您可以使用以下VB代碼:

Friend Interface IImpliedReadOnly 
    ReadOnly Property SomeNumber() As Integer 
End Interface 

Friend Class Implementation 
    Implements IImpliedReadOnly 

    Private someNumber_Renamed As Integer = 0 
    Private ReadOnly Property IImpliedReadOnly_SomeNumber() As Integer Implements IImpliedReadOnly.SomeNumber 
     Get 
      Return SomeNumber 
     End Get 
    End Property 
    Public Property SomeNumber() As Integer 
     Get 
      Return someNumber_Renamed 
     End Get 
     Set(ByVal value As Integer) 
      someNumber_Renamed=value 
     End Set 
    End Property 
End Class 
0

現在試試這個...

Interface IImpliedReadOnly 
ReadOnly Property SomeNumber() As Integer 
End Interface 
Class Implementation 
Implements IImpliedReadOnly 
Private m_someNumber As Integer = 0 
Public Property SomeNumber() As Integer Implements IImpliedReadOnly.SomeNumber 
    Get 
     Return m_someNumber 
    End Get 
    Set 
     m_someNumber = value 
    End Set 
End Property 
End Class 
+0

好吧,讓我再次檢查.... –

+0

把返回1而不是返回m_someNumber –

+0

@Rony:你所做的一切都證明了Pharap所問的問題。 –

8

你的代碼在C#中,因爲C#支持隱式接口的實現,VB.NET只支持顯式接口實現。

如果要實現使用顯式接口實現你的C#示例以下適應,你會得到以下錯誤:

代碼:

interface IImpliedReadOnly 
{ 
    int SomeNumber { get; } 
} 
class Implementation : IImpliedReadOnly 
{ 
    private int someNumber = 0; 
    int IImpliedReadOnly.SomeNumber 
    { 
     get { return someNumber; } 
     set { someNumber = value; } 
    } 
} 

錯誤:

Error 1 'Test.IImpliedReadOnly.SomeNumber.set' adds an accessor not found in interface member 'Test.IImpliedReadOnly.SomeNumber'

+0

@Pharap是的,這不是你的代碼。我想告訴你,如果使用顯式接口實現,C#和VB.NET的行爲方式相同。 – kmatyaszek