2014-01-24 89 views
3

我有這種接口接口和共享執行

public interface IColumn 
{ 
    bool IsVisible {get;set;} 

    bool IsGroupBy { get; set; } 

    Type CLRType { get; set; } 

    string GetGroupByString(); 

    string GetFilterString(); 
} 

和我有類將繼承它,第3個特性的實現是完全一樣的。

string GetGroupByString();實施爲所有類的相同,除了2

,所以我提出的稱爲ColumnBase抽象類繼承了IColumn接口並實現其所有成員,並添加支持字段,因爲我需要實現INotifyPropertyChanged

並使我的類繼承自ColumnBase,並且我重寫了並非意味着相同的實現。我有一個非常有限的經驗與接口和抽象類,我的問題是,如果你有一個接口和一些類將繼承它,你意識到一些但不是所有的屬性和功能的實現是相同的,你是否創建了一個抽象類,並將默認實現並在具有特殊實現的類中重寫它?

+3

是的,這似乎是一個很好的解決方案。將您允許覆蓋的方法標記爲「virtual」,並在子類中指定特定的子類行爲。 –

+0

@JeroenVannevel但虛擬產生了什麼區別? – Kanka

+1

它可以防止方法隱藏問題,這取決於你的變量是如何定義的。 [This](http://msdn.microsoft.com/en-us/library/aa645767(v = vs.71).aspx)應該說清楚。 –

回答

1

這將根據您的意見和偏好得到答案。恕我直言,我認爲這將是最適合抽象類與兩種方法需要不同的實現聲明爲抽象方法;對方法使用抽象意味着實現必須具有該方法的實現。

public abstract class ColumnBase 
{ 
    public bool IsVisible { get; set; } 

    public bool IsGroupBy { get; set; } 

    public Type CLRType { get; set; } 

    public virtual string GetGroupByString() 
    { 
     return "base string"; 
    } 

    public abstract string GetFilterString(); 
} 

public class ConcreteColumn : ColumnBase 
{ 
    public override string GetGroupByString() 
    { 
     return "concrete string"; 
    } 

    public override string GetFilterString() 
    { 
     return "who owns the filter string?"; 
    } 
} 
+0

但用於字符串GetGroupByString();對於除了2之外的所有類,實現是相同的,這意味着對於上面我必須一次又一次地在每個類中編寫相同的實現? – Kanka

+1

他可以讓它變成虛擬的,然後在其他人中覆蓋它。 –

+0

編輯我的答案說清楚 –

1

您是否創建了一個抽象類,並將默認實現並在具有特殊實現的類中重寫它?

是的,我會做exactly.Actually它是一種abstract類的目的和virtual/override features.In你的情況,我認爲你不需要IColumn接口,可以使用抽象class.And實現所有常見方法,然後如果你想改變一個方法的行爲,可以在嵌套類中重載它。

如果標記與virtual的方法,你可以在嵌套類覆蓋它,你可以改變這個方法的行爲取決於您當前的class.You可能想看看在documentation瞭解更多詳情。

1

如果你的派生類是基類的一些專門的版本,那麼這將是一個好主意,從一個基類繼承它,就像class Rectangle : Shape。這就是爲什麼派生類都是同一件事的專用版本。例如Rectangle和Circle實際上就是一種形狀。但考慮使用接口,當你有不同對象,你想要一些類似的行爲。例如,您可以序列化Bird對象和Chair對象,即使他們只有NameAge性質,這不是一個好主意,以獲得他們形成具有NameAge性能和Serialize()方法的基類,因爲它們是不同的東西。儘管Serialize()方法的實現在它們兩者中都是相同的,但最好是有一個ISerializable接口並在兩個類中實現它。