2009-04-29 88 views
5

婁被簡化我的代碼的版本:通用類工廠問題

public interface IControl<T> 
{ 
    T Value { get; } 
} 

public class BoolControl : IControl<bool> 
{ 
    public bool Value 
    { 
     get { return true; } 
    } 
} 

public class StringControl : IControl<string> 
{ 
    public string Value 
    { 
     get { return ""; } 
    } 
} 
public class ControlFactory 
{ 
    public IControl GetControl(string controlType) 
    { 
     switch (controlType) 
     { 
      case "Bool": 
       return new BoolControl(); 
      case "String": 
       return new StringControl(); 
     } 
     return null; 
    } 
} 

的問題是在ControlFactory類的getControl方法訪問。因爲它返回IControl並且我只有一個通用接口IControl < T>。我不能提供T,因爲在Bool的情況下,它會布爾和字符串的情況下,它將是字符串。

任何想法,我需要做的,以使其工作?

回答

5

IControl得到IControl<T>

public interface IControl<T> : IControl 
{ 
    T Value { get; } 
} 

UPDATE

如果我missunterstood你,你不希望非通用接口,你將不得不作出的方法GetControl()通用的,太。

public IControl<T> GetControl<T>() 
{ 
    if (typeof(T) == typeof(Boolean)) 
    { 
     return new BoolControl(); // Will not compile. 
    } 
    else if (typeof(T) == typeof(String)) 
    { 
     return new StringControl(); // Will not compile. 
    } 
    else 
    { 
     return null; 
    } 
} 

現在你有一個新的控件不能隱式現澆到IControl<T>這個問題,你必須更加明確。

public IControl<T> GetControl<T>() 
{ 
    if (typeof(T) == typeof(Boolean)) 
    { 
     return new (IControl<T>)BoolControl(); 
    } 
    else if (typeof(T) == typeof(String)) 
    { 
     return (IControl<T>)new StringControl(); 
    } 
    else 
    { 
     return null; 
    } 
} 

UPDATE

改變了從鑄造到as IControl<T>(IControl<T>)。這是首選,因爲如果有錯誤,它會引起異常,而as IControl<T>會自動返回null

3
public IControl<T> GetControl<T>() 
{ 
    switch (typeof(T).Name) 
    { 
     case "Bool": 
      return (IControl<T>) new BoolControl(); 
     case "String": 
      return (IControl<T>) new StringControl(); 
    } 
    return null; 
} 

更新;糾正了代碼中的一些錯誤。繼承人呼叫獲得一個類:

IControl<bool> boolControl = GetControl<bool>(); 
+3

@Vadim - 我強烈建議您使用Daniel的解決方案,他在比較類型而不是使用字符串。使用該類型的名稱更容易出錯。 – 2009-04-29 19:43:05

0

返回類型必須是通用的,因爲它是。想想你會如何使用它。返回強類型對象可避免使用通用工廠方法。

即使你能做到這一點,有什麼的

IControl<bool> boolControl = controlFactory.GetControl("bool"); 

增益,或者一個會工作,

IControl<bool> boolControl = controlFactory.GetControl<bool>("bool"); 

在特定

IControl<bool> boolControl = controlFactory.GetBoolControl("bool"); 

無論哪種方式,你在客戶端有switch()。返回一個對象,或者有一個非類型的IControl接口。