2011-09-13 38 views
1

假設類A是抽象的,並且定義了從它繼承的類B必須提供的只讀屬性。它是更好的做法來定義性能如抽象或具象設置保護:只讀屬性繼承:abstract或set-protected

public abstract class A 
{ 
    public abstract int Value { get; } 
} 
public class B : A 
{ 
    public override int Value { get { return 1; } } 
} 

OR

public abstract class A 
{ 
    public int Value { get; protected set; } 
} 
public class B : A 
{ 
    public B() 
    { 
     Value = 1; 
    } 
} 

我認爲第一個解決方案可能是更好的,但我想聽聽其他人的意見。

回答

0

這取決於你的意思是隻讀。如果你的意思是隻讀的呼叫者,那麼我寧願第二個解決方案。

第一個解決方案強制子類實現get,這很好。但它禁止孩子執行set(即使是受保護的),這是不好的。

第二種解決方案是,整個Value接口由基類定義,這很好,子類在選擇時仍然可以設置Value,這也很好。

另一方面,如果「只讀」表示您的意思是真正的只讀,即使子類不允許設置值,那麼第一個解決方案會更好。如果你嘗試設置它,你甚至會得到正確的編譯錯誤。

+0

我會接受你的答案,因爲它有一些好點,沒有人做出了貢獻。然而,在此期間,我最終使用瞭解決方案1.考慮以下使用解決方案2:第三個類C繼承自B,它也想公開該值。此外,值不是常量,而是從B和C中的許多方法中設置。可能發生的情況是,B將在執行其一種方法時提供其值,而不是C應該提供的值。換句話說,C不能正確覆蓋該屬性。所以我認爲解決方案1通常更合適。 – Zmaster