2014-05-02 72 views
1

我認爲我不太瞭解泛型以使我的代碼正常工作,但我找不到解釋它爲什麼不起作用的解釋。如何鏈接泛型和派生類型?

我有這個通用抽象類

public abstract class RepositoryBase 
{ 
} 

我必須實例化它作爲SpecificRepository

public class SpecificRepository : RepositoryBase 
{ 
} 

現在,我有這個通用抽象類ManagerBase這使用必須派生自的通用類型庫信息庫

public abstract class ManagerBase<T> where T : RepositoryBase 
{ 
    public T repository; 

    protected ManagerBase(T repository) 
    { 
     this.repository = repository; 
    } 
} 

,我必須與SpecificManager實例化:

public class SpecificManager : ManagerBase<SpecificRepository> 
{ 
    public SpecificManager(SpecificRepository repostRepository) : base(repostRepository) 
    { 

    } 
} 

這樣一來,我可以有一個類從派生每個類派生RepositoryBaseManagerBase

但我不能有一個ControllerBaseSpecificController如:

public class ControllerBase<T> where T : ManagerBase<RepositoryBase> 
{ 
    public T manager; 

    protected ControllerBase(T manager) 
    { 
     this.manager = manager; 
    } 
} 

public class SpecificController : ControllerBase<SpecificManager> 
{ 
    public SpecificController(SpecificManager manager) : base(manager) 
    { 

    } 
} 

看來,我可以這樣做:

public abstract class ControllerBase<T> where T : ManagerBase<SpecificRepository> 
{ 
    public T manager; 

    protected ControllerBase(T manager) 
    { 
     this.manager = manager; 
    } 
} 

public class SpecificController : ControllerBase<SpecificManager> 
{ 
    public SpecificController(SpecificManager manager) : base(manager) 
    { 

    } 
} 

這並不適合我的需要雖然。

可有人請向我解釋什麼,我理解錯了,如何是我想繼續要能夠有一個SpecificManager每班從派生ControllerBase

在此先感謝。

問候。

+0

假設你有一個泛型類型,'g^'(所以,一個名爲'T'一個類型參數)。進一步假設你還有兩種類型,'T1'和'T2',並且這些類型之間有某種形式的繼承關係。僅僅因爲他們有這種繼承關係,那不會**意味着'G '和'G '具有相同的*關係。實際上,'G '和'G '類型之間有* no *繼承關係。 –

回答

0

下面的工作,雖然語法稍長:

public class ControllerBase<TManager, TRepository> 
    where TManager : ManagerBase<TRepository> 
    where TRepository : RepositoryBase 
/* */ 

public class SpecificController : ControllerBase<SpecificManager, SpecificRepository> 
相關問題