2013-01-16 106 views
4

我有一個名爲IStructuredReader的接口,它從文件中讀取一些結構化數據並將其顯示在表單中。它有一個名爲Sync()的成員,在實現時會掃描用戶指定數據模式的數據。如何在運行時確定接口成員是否已實現?

IStructuredReader的某些實現不具有同步功能。那些實現爲Sync()方法拋出NotImplementedException。我希望能夠檢查正在實施的這種方法,以便我可以調暗表單上的按鈕,如果不是。

我能想到的一些方法是可以這樣做的所有這一切看起來笨拙和複雜:

  1. 分離Sync方法變成自己的接口,繼承它爲那些支持的實現能力,並試圖投讀者對象將其識別能力,

  2. NotImplementedAttribute,有了它裝飾構件,並檢查使用反射屬性的存在,

  3. HasSyncCapability布爾值屬性添加到接口。

這樣做是否有規範的方式?

+0

我會拋棄#2。如果沒有別的,這只是更多的工作,沒有具體的好處。 – Servy

+0

不支持它的方法可能不做任何事情,而不是拋出? 「Sync」是否需要返回某些內容,或者調用者是否根據是否定義了「Sync」而採取不同的行爲? – Servy

+0

'CanSync'將會是一個更好的名字,並且'TrySync'可能是同步操作的更好選擇。它可能僅僅因爲不可同步而失敗,總是返回'false'。 – Oded

回答

6

這聽起來像你真的應該有兩個接口。你的Sync()方法顯然是增加了基本接口的功能,這表明這是一個單獨的問題,因爲它不是IStructuredReader的要求。我建議爲支持這種類型的類型添加第二個接口,然後在查看圖層中檢查它們。

+2

[ISP](http://en.wikipedia.org/wiki/Interface_segregation_principle)來拯救... – Oded

+0

我並不完全同意你的看法。看看Stream類。 Seek沒有界面。在這種情況下,擁有'CanSeek'或'CanRead'更直觀。而不是「ISeekable」等。所以我建議在這裏使用'CanSync'。 –

+0

@CSharper關於'Stream'類有很多(經常有效的)批評 - 我不會認爲這是一個很好的樣例用作設計。例如,請參閱:http://turingmachinesareprograms.blogspot.com/2009/09/net-design-mistakes-streams.html –

2

規範的方法是讓接口公開將要實現的方法,所以我看到的最乾淨的解決方案是用這種方法創建另一個接口,可能是Syncronizable。如果你的對象實現了這個接口,你就知道這個方法在那裏,而這根本不笨拙。使用反射或額外的屬性確實不像解決方案那樣乾淨,但這並不意味着如果它讓你的生活變得更輕鬆,那麼不應該去那些;)

相關問題