2013-09-24 196 views
0
public class Manager<T> where T: IBallGame 
{ 
T GetManager() 
{ 
//if T is ISoccer return new Soccer() 
//if T is IFootball return new Football() 

//This wont work. Why? 
if (typeof(T) == typeof(ISoccer)) 
       return new Soccer(); 
} 
} 

Interface ISoccer: IBallgame 
{ 
} 
class Soccer: ISoccer 
{ 
} 
Interface IFootball: IBallgame 
{ 
} 
class Football:IFootball 
{ 
} 

我已經檢出這個問題How do I make the return type of a method generic?。有沒有比Convert.ChangeType()更優雅的東西?在c中返回泛型類型#

爲什麼在類型有限制時不能返回足球或足球的實例?

+2

我認爲因爲足球和足球需要滿足兩個接口才能符合經理級聲明,而不只是一個或另一個。 –

+0

@ValentinKuzub:爲什麼呢?我基本上將兩個Manger類合併爲一個。如果沒有這個,將會有兩個類SoccerManager和FootballManger,每個都有一個方法GetInstance。如果檢查T的類型被認爲是不好的編碼,那麼泛型類的目的是相當有限的,你不覺得嗎? – bobbyalex

+0

你認爲'List '是有限的嗎?它是否需要檢查'T'的類型來完成它的工作?泛型類的意義在於,只要T符合通用類的約束,類的方法的實現就可以保持,而不管T的類型如何。在你的情況下,'GetManager'的實現取決於'T'的類型。如果你真的是RY,你只能違反DRY。 –

回答

2
public class Manager<T> where T : class, IBallgame 
{ 
    T GetManager() 
    { 
     //if T is ISoccer return new Soccer() 
     //if T is IFootball return new Football() 


     if (typeof(T) == typeof(ISoccer)) 
      return new Soccer() as T; 

     //code 
    } 
} 

public interface IBallgame 
{ 

} 
public interface ISoccer : IBallgame 
{ 
} 
public class Soccer : ISoccer 
{ 
} 
public interface IFootball : IBallgame 
{ 
} 
class Football : IFootball 
{ 
} 

你只需要一個約束和as T

+0

這不會工作,這是整個問題。你會得到一個編譯時錯誤,說'不能將足球轉換爲T' – bobbyalex

+0

適用於我,筆記類約束和T –

+0

該評論是在你編輯之前。這工作:) – bobbyalex

5

如果您期望基於泛型的確切類型的不同實現,那麼您實際上不再處理泛型。

您應該定義兩個類,例如, FootBallManager : Manager<IFootball>SoccerManager : Manager<ISoccer>

根據您的更新,你真正想要的是你的通用的new()併產生額外的約束來實現您的類作爲

public class Manager<T> where T: IBallGame, new() 
{ 
    T GetManager() 
    { 
     return new T();   
    } 
} 
+0

@ValentinKuzub:我已經更新了這個問題。 – bobbyalex

+0

謝謝,現在看起來好多了 –

+0

原帖來自post剛剛不會在這裏編譯新管理器();原因ISoccer不適合新的()約束 –