2013-03-22 106 views
1

有沒有辦法創建一個實現以下兩個通用接口的基類?然後這個基類將被可以從兩個接口中的任何一個調用方法的「其他」類繼承。創建實現兩個通用接口的通用基類?

public interface IGenericRepositoryOne<E> where E : Entity 
{ 
    void Save(E entity); 
    void Save(List<E> entityList); 
    E Load(Guid entityId); 
} 

public interface IGenericRepositoryTwo<D, E> where E : Entity 
{ 
    void Save(D dto); 
    void Save(List<D> entityList); 
    D Load(Guid entityId); 
} 

現在我們有單獨實現每個接口的兩個不同的版本庫:

public abstract class RepositoryOne<D, E> : IGenericRepositoryOne<D, E> where E : Entity {...} 

public abstract class RepositoryTWO<E> : IGenericRepositoryTwo<E> where E : Entity {...} 

然後有哪些需要繼承的類要麼RepositoryOneRepositoryTwo。正是在這些培訓班裏,我希望做一些保理,例如:

public class MessageDataTypeRepository : RepositoryTwo<MyEntityType> 
{ 
    // here when I call the method Load() I want it for RepositoryOne implementation. 
} 

public class MessageDataTypeRepository : RepositoryOne<MyDTOType, MyEntityType> 
{ 
    // here when I call the method Load() I want it for the RepositoryTwo implementation. 
} 
+4

你肯定的在第二個?我在成員名單中看不到E。 – 2013-03-22 19:17:12

+0

除此之外,嘗試實現這兩個接口時遇到了什麼錯誤?它在哪裏給你帶來麻煩? – 2013-03-22 19:20:19

+0

@AnthonyPegram:是的,我需要'E'也是因爲還有其他操作使用它,爲簡潔起見,以上略去。我更新了我的問題,進一步闡明瞭我期待的目標。 – VoodooChild 2013-03-22 20:09:11

回答

3

可以實現這兩個接口,並使用Explicit Interface Implementation實現一或兩個。這允許您爲每個接口有不同的實現,如果這是一個需求。

如果這不是必需的,簡單地實現這兩個應該是簡單的,因爲這兩個接口實際上是相同的一個泛型類型的術語:

public class Repository<D,E> : IGenericRepositoryOne<D>, IGenericRepositoryTwo<D,E> 
    where D : Entity 
    where E : Entity 
{ 
    void Save(D dto) {} 
    void Save(List<D> entityList) {} 
    D Load(Guid entityId) 
    { 
      // Implement... 
    } 
} 

編輯:

響應到你編輯的問題,你的實際目標 -

這裏的一個選擇是不使用繼承,但組成。通過使用組合,您可以讓您的「通用存儲庫」類公開一個有意義的接口,並在內部構建相應的存儲庫。然後,它可以根據需要將這些方法映射到適當的存儲庫。這將使您的存儲庫有效地執行Adapter Pattern以包含具有通用接口的存儲庫。

+0

感謝您的評論。我進一步更新了我的問題,以反映我正在努力完成的任務,如果可能的話可以請看看評論,否則我正在查看很多重複的相同存儲庫,但幾乎沒有什麼變化。 – VoodooChild 2013-03-22 20:17:18

2

是的,這是可能的,這就是所謂Explicit Interface Implementation

您可以實現從兩個接口的方法有一個方法:

public void Save(D entity) { } 

或單獨實施:

public void IGenericRepositoryOne.Save(D entity) { } 

public void IGenericRepositoryTwo.Save(D entity) { }