2009-11-16 95 views
0

一些朋友正在討論繼承的使用以及如何檢查子類是否屬於特定類型,並且我們決定將它在此處發佈在Stack上。辯論的是如果你應該在基類中實現一個抽象枚舉來檢查子類的類型,或者你應該使用is運算符。子類檢查,是運算符還是枚舉檢查

備選1

public abstract class Document{ 
} 
public class PDF:Document{ 
} 

Check: If (myobj is PDF) 

Alt鍵2.

public abstract class Document{ 
    public abstract DucumentType TypeOfDocument {get;} 
} 
public class PDF:Document{ 
    public DucumentType TypeOfDocument { get{return DucumentType.PDF };} 
} 
public enum DucumentType{ 
    PDF, Word 
} 

Check: If (myobj.TypeOfDocument == DucumentType.PDF) 

的那些爲ALT1。認爲Alt2略微打破SRP,你不會利用OO,你重複抽象。因爲繼承是類之間最難聯繫的事情,所以你無法避免知道它們,並且如果你必須通過繼承來減少影響。 Alt2也打破DRY

對於Alt2的那些,Alt2將完全刪除類型檢查,並將它替換爲檢查此枚舉的選項。去除所有子類的所有硬連接,並且枚舉本身的值並沒有說明當前正在執行哪個具體實現。

你對這兩種選擇有什麼看法?

沒有討論繼承與組合等,這是另一個問題!

回答

3

爲什麼你首先需要知道?我同意偶爾有必要,但在可能的情況下,您應該讓Document類型具有適當的抽象功能,以便通過繼承完成專業化,而不是調用方對其進行不同的處理。

如果不同的子類可以共享文檔類型但只想分享繼承層次結構,我只會使用枚舉方法。這將是非常罕見的,IME。

0

IMO你應該使用is運算符。 它給你相同的結果,而不會污染(抽象)類代碼。

0

我有類似的情況,除了在我的情況下,DocumentType枚舉需要隨着各種類型的增加而增長。通過使用Enum,類型檢查要好得多,但它要求每次添加新的DocumentType時重新編譯「通用」基類。

我目前正在思考的另一種選擇是使用接口屬性將類型作爲字符串返回。這對於類型檢查來說並不好,但我的代碼的其餘部分具有防止流氓DocumentType對象的必要驗證。我寧願有一個不同的解決方案,但沒有想到。