通用类工厂问题

时间:2009-04-29 19:19:17

标签: c# oop

Bellow是我所拥有的代码的简化版本:

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&lt; T&gt;这是一个通用接口。我不能提供T,因为在Bool情况下它会bool而在String情况下它将是字符串。

知道我需要做些什么才能让它发挥作用?

3 个答案:

答案 0 :(得分:5)

只需从IControl<T>派生IControl

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

<强>更新

如果我错过了你的理解,并且你不想要非通用的界面,那么你也必须使方法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;
    }
}

<强>更新

将演员从as IControl<T>更改为(IControl<T>)。这是首选,因为如果在as IControl<T>静默返回null时出现错误,它将导致异常。

答案 1 :(得分: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>();

答案 2 :(得分:0)

返回类型必须是通用的,因为它确实是。想想你将如何使用它。返回强类型对象不需要通用工厂方法。

即使你能做到,也有什么好处

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

或者,可以工作的那个,

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

特定的

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

无论哪种方式,您都有客户端的switch()。返回一个对象,或者有一个非类型的IControl接口。