2012-06-28 124 views
2

殼體示例如下。基本上,我希望客戶和員工從IPerson實施SSN財產。但是,我希望客戶能夠獲得並設置(這不是問題),但我希望員工只能獲得。我可以重寫接口屬性嗎?

Public Interface IPerson 
    Property SSN As String 
End Interface 

Public Class Client 
    Implements IPerson 
    Public Property SSN As String Implements AELName.IPerson.SSN 
     Get 
      Return _SSN 
     End Get 
     Set(value As String) 
      _SSN = value 
     End Set 
    End Property 
End Class 

Public Class Employee 
    Implements IPerson 
    Public Readonly Property SSN As String Implements AELName.IPerson.SSN 
     Get 
      Return _SSN 
     End Get 
    End Property 
End Class 

僱員產生的誤差「‘SSN’無法實現‘SSN’,因爲不存在在接口‘IPerson’匹配屬性」。是否有一種簡單的方法來覆蓋Employee的SSN實現?

回答

5

你可以實現一個空的Set - 一個不更新任何東西。

Public Class Employee 
    Implements IPerson 
    Public Readonly Property SSN As String Implements AELName.IPerson.SSN 
     Get 
      Return _SSN 
     End Get 
     Set 
      ' Make read only for Employee 
     End Set 
    End Property 
End Class 
+0

我會試試這個,當我回到它,但不會使用Employee類的任何東西仍然有寫訪問SSN,它只是不會設置任何幕後?我希望如果任何未來的開發人員嘗試在員工身上設置SSN,就會引發錯誤。 – Curtis

+0

@Curtis - 是的,這會失敗。但是你可以拋出異常。 – Oded

+0

拋出異常的極佳解決方案。 – Curtis

2

我建議拆分界面進入IReadablePerson和IReadWritePerson,後者繼承了前者。請注意,前一個界面不是IImmutablePerson,因爲後一個名稱意味着該類的消費者他們不應該期望它的任何屬性會改變;實施IReadWritePerson的對象不會遵守這樣的期望,但會遵守該人應該可讀的期望。

與分裂的接口有一個小小的煩惱的是,這將是必要的IReadWritePerson包括在其讀/寫性能的聲明的修改Shadows,和IReadWritePerson實施者必須同時提供一個只讀實現IReadablePersonIReadWritePerson的讀寫實現。在C#中,讀寫屬性的公共實現可以自動生成任何類名爲只讀,只寫或讀寫屬性的實現,這些屬性是類實現的任何接口的一部分,但是在顯式聲明哪個接口正在實施中,接口的風格(只讀,只寫,讀寫)必須與實現的風格精確匹配。煩人。

的煩惱是由事實變得更糟的是不能簡單地聲明IReadableFoo具有隻讀屬性,IWriteOnlyFoo有隻寫屬性,並有IReadWriteFoo簡單地同時繼承。如果一個接口實現了一個只讀屬性和一個只寫屬性,那麼這兩個屬性都不可用,因爲編譯器會在somevariable = object.somePropertysomeObject.someProperty = someVariable這樣的語句中聲明它是「模棱兩可的」要使用的實現。不是我可以看到任何不明確的地方 - 我看不出第一個可以使用除getter之外的任何東西,或者後者除了setter外什麼都可以使用,但編譯器無法解決它。

+0

非常好的主意來拆分接口。 – Curtis

+0

@Curtis:謝謝。我爲你的細讀增加了幾段。 – supercat

0

要回答你的標題問題「我可以重寫一個接口屬性」......絕對如此。以下是一個如何操作的例子。您只需將可覆蓋的關鍵字添加到您的基本具體實現中即可。我知道這並不能解決將屬性更改爲ReadOnly,但我想我會指出覆蓋基類具體的接口實現是可能的。

Module Module1 

    Sub Main() 

     Dim iEntity As IEntity = New MyEntity 

     iEntity.SetMessage(iEntity) 

     Console.WriteLine(iEntity.Message) 

     Console.ReadKey() 

    End Sub 

End Module 

Public Interface IEntity 

    Property Message As String 

    Sub SetMessage(entity As IEntity) 

End Interface 


Public Class MyEntity 
    Inherits BaseEntity 

    Public Overrides Property Message As String 
     Get 
      Return String.Format("{0}.. and overroad.", MyBase.Message) 
     End Get 
     Set(value As String) 
      MyBase.Message = value 
     End Set 
    End Property 

    Public Overrides Sub SetMessage(entity As IEntity) 

     Me.Message = "I was set from MyEntity." 

    End Sub 

End Class 


Public Class BaseEntity 
    Implements IEntity 

    Public Overridable Property Message As String Implements IEntity.Message 

    Public Overridable Sub SetMessage(entity As IEntity) Implements IEntity.SetMessage 
     Me.Message = "I was set from BaseEntity." 
    End Sub 

End Class 
相關問題