【问题标题】:Interface method multiple return types [duplicate]接口方法多种返回类型
【发布时间】:2021-04-29 05:44:40
【问题描述】:

是否可以有一个接口与一个可以返回多种类型的方法?

我知道有动态类型,或者有

public T MyMethod<T>() { }

但是实现这个接口的类仍然会抱怨不兼容的类型。我不能在实现接口的类中使用动态类型,因为我希望调用者知道它将收到什么样的结果。

public interface Command {
    T Execute<T> ();
}}

public class GetMaxFallSpeedCommand : Command {
    public float Execute() {
        return 1f;
    }
}

返回“没有实现接口……”

具体用法:

void Main() {
    var myClass = new MyClass();
        
    myClass.ExecuteCommand(new MyCommandThatJustDoesSomething());

    float someValue = myClass.ExecuteCommand(new MyCommandThatReturnsAFloat());
}

【问题讨论】:

  • “但是实现这个接口的类仍然会抱怨不兼容的类型”是什么意思,你能举个例子吗?你究竟是如何在某个类中实现这个接口的
  • 实现类在不同情况下是否可能返回不同的类型,或者给定的实现是否总是返回相同的类型。如果是第二个,那么通用接口将是一个不错的选择,您可以使用它返回的类型来定义您的实现类。
  • 对不起,我更新了。不,每个实现接口的类都会返回给定的类型。
  • 您没有说明如何使用它,所以您得到的答案很幸运,它仍然可能导致“下一个问题”。如何处理实现ICommand&lt;ClassYouDidntKnowExisted&gt; 的对象?以及在返回时如何使用ClassYouDidntKnowExisted 的实例?
  • 对我来说似乎很清楚。我只是为一个类设置了一种方法,可以将消息传递给另一个类,除了它可以预期的响应类型(或不知道)之外,不知道该类的任何信息。

标签: c#


【解决方案1】:

您只需将命令设为通用接口,然后在实现接口时指定您正在实现的接口的类型。您的示例在下面进行了修改。

编辑: 我将ICommand 更改为IExecute,因为.NET 中已经有一个ICommand 接口。另外,我添加了一个没有泛型类型的接口,用于实现基于这个问题的 cmets 返回 void 的类。

public interface IExecute<T>
{
    T Execute();
}

public interface IExecute
{
    void Execute();
}

public class GetMaxFallSpeedCommand : IExecute<float>
{
    public float Execute()
    {
        return 1f;
    }
}

public class DoSomethingReturnNothing : IExecute
{
    public void Execute()
    {
        //do something
    }
}

【讨论】:

  • 为了 OP 的利益,我想指出您需要知道 T 可能是什么并测试该接口,例如ICommand&lt;float&gt;,或者使用反射来找到封闭构造的接口,即ICommand&lt;T&gt;。在反射情况下,您可能仍将动态调用该方法并返回object(并将float 装箱),因此您不妨让它返回object
  • 这似乎是我正在寻找的。但是,有时我需要我的命令不返回任何内容,并且使用 void 我得到“关键字 void 不能在此上下文中使用”。公共类 DoSomething : 命令 { public void Execute() { } }}
  • 为此提供两个快速选项:实现ICommand&lt;object&gt;Execute 方法返回null(或者如果您愿意,可以返回一个空对象),或者定义ICommand(无类型参数)和它返回void。紧密构造的接口已经彼此不同,因此没有返回值的非泛型接口只是另一个不同的接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2014-08-12
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多