【问题标题】:One method multiple Interface return types一种方法多种接口返回类型
【发布时间】:2011-12-01 20:31:55
【问题描述】:

假设我有

public class ClassA : Ione, Itwo
public class ClassB : Ione, Itwo
public class ClassC : Ione, Itwo

还有一个方法 MethodA,它返回 ClassA、ClassB 或 ClassC 的实例。 MethodA 返回类型可以是 Ione 或 Itwo。

我怎样才能做到这一点?

我尝试过使用这样的泛型:

public T MethodA<T>(myEnum e) where T : Ione, Itwo

但在输入 return (T)new ClassA(); 时,我收到错误“无法将类型 ClassA 转换为 T”。

谢谢。

【问题讨论】:

    标签: c#


    【解决方案1】:

    联合两个接口:

    interface ITogether : Ione, Itwo { }
    

    并将其用作返回类型。

    您可能需要您的类来实现 ITogether 而不是 Ione 和 Itwo,但您应该尝试两种方式。

    【讨论】:

    • 谢谢。这和 BrokenGlass 是解决问题的有效答案。当我使用泛型作为一种方法时,我将其标记为答案。
    【解决方案2】:

    您可以定义一个新接口 IThree,它继承自 IoneItwo - 然后在您的具体类中实现该接口:

    public interface IThree : Ione, Itwo { }
    

    然后将其用作返回类型:

    public IThree MethodA<T>(myEnum e) where T : IThree
    {
        return new ClassA();
    }
    

    要使这个方法通用,你可以添加一个new() 约束并返回你想要的类型

    public static T MethodOfType<T>() where T : IThree, new()
    {
        return new T();
    }
    

    【讨论】:

    • 否则不可能 - 您将无法将 A 的实例转换为 T
    • 嗯,你是对的。现在需要睡觉了。 (顺便说一句,这使得泛型有点多余,但是方法的使用也是有问题的)
    • @leppie:我认为这个例子让我们失望了——如果 OP 的 new A() 真的是通用的,那么在我的回答中就不需要它了。
    • 谢谢。这是一个很好的解决方案。使用泛型只是我认为可行的一种方法。
    【解决方案3】:

    首先将 ClassA 转换为对象

    public T MethodA<T>() where T : Ione, Itwo
    {
        return (T)(object)new ClassA();
    }
    

    应该可以工作,但可能会引发运行时异常。你可能想要的是类似的东西

    public T MethodA<T>() where T : Ione, Itwo
    {
        return (T)(object)Activator.CreateInstance(typeof(T));
    }
    

    另外请注意,如果 T 没有空的构造函数,这仍然会导致异常。您可以为此添加编译时检查,方法是将声明更新到 where T : Ione, Itwo, new()

    【讨论】:

    • 如果T 不是ClassA,这将爆炸。
    • 是的,我可能应该这样写。这有点危险,因为它可能在运行时失败。我假设他总是在 T 是 typeof(ClassA) 的地方调用它。
    • 只需 return new T()new() 设置约束一起工作 - 不需要 Activator.CreateInstance()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2014-08-12
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多