2013-03-22 140 views
2

我想了解什麼層次將是最好的繼承描述如下。到目前爲止,我有如下:來自通用接口的通用抽象基類

public interface IManager<T> where T : ISomeObject 
{ 
    bool Add(T o); 
    bool Remove(T o); 
    bool Update(T o); 
} 

但後來我想每個派生類有一個參數化的構造函數。所以我去了:

public abstract class Manager<T> : IManager<T> where T : ISomeObject 
{ 
    protected readonly INeededObject obj; 

    protected Manager(INeededObject o) 
    { 
     obj = o; 
    } 
} 

任何想法應該如何去解決這個設計問題?提前致謝。

回答

0

可能(這再次可能是錯的)有點深夜「智慧熱」的。但修改了我的界面是爲遵循非通用之一:

public interface IManager 
{ 
    bool Add(ISomeObject o); 
    bool Remove(ISomeObject o); 
    bool Update(ISomeObject o); 
} 

我的抽象類看起來如下:

public abstract class Manager<T> : IManager<T> where T : ISomeObject 
{ 
    protected readonly INeededObject obj; 

    protected Manager(INeededObject o) 
    { 
     obj = o; 
    } 

    public abstract bool Add(T o); 
    bool IManager.Add(ISomeObject obj) 
    { 
     return this.Add((T) obj); 
    } 
} 
3

你快到了。你也可以在你的基類中使用泛型類型參數。

public abstract class Manager<T> : IManager<T> where T : ISomeObject 
{ 
    protected readonly T obj; 

    protected Manager(T o) 
    { 
     obj = o; 
    } 
} 

您可以使用參數化類型太像

protected Manager(IList<T> o) 
{ 
    ... 
} 
+0

我不知道,但有兩個在'接口定義什麼'T' '和'抽象類'感覺有點奇怪和錯誤。 – Kunal 2013-03-22 23:44:31

+0

@Kunal你不是在兩個地方定義'T'。 'T'只是一個參數名稱 - 有點像函數參數。你可以在兩個地方給「T」任何你想要的名字,例如班級經理'。 'T'只是一個慣例。 – 2013-03-23 00:10:32

+0

是的,我理解泛型的用法,但是我仍然認爲在'interface'和'abstract class'中冗餘地指定'T'類型是不是沿着OOD線的某處。我同意你的做法是做參數化構造函數的一種方法,但我的編輯就是我正在尋找的東西(除非存在缺陷)。 – Kunal 2013-03-23 00:29:59