方法重载实现相同接口的对象



我很惊讶这甚至没有编译。这是我在编写的 WCF 服务中遇到的问题的测试程序(基本上客户端向 wcf 服务发送不同任务的列表,然后服务器端处理不同任务的列表,并且需要为每个任务运行不同的方法)。

编译错误:无法从"用户查询.IMyInterface"转换为 'UserQuery.MyObj1'

public interface IMyInterface{};
public class MyObj1 : IMyInterface{};
public class MyObj2 : IMyInterface{};

public String Process(MyObj1 obj)
{
return "did one";
}
public String Process(MyObj2 obj)
{
return "did two";
}
void Main()
{
    IMyInterface obj = new MyObj1();
    var s = Process(obj);
    s.Dump();
}
您必须

显式地将obj转换为MyObj1,因为编译器不知道您将该类的实例分配给obj

IMyInterface obj = new MyObj1();
var s = Process((MyObj1) obj);

obj的实际类型仅在运行时已知。

更好的选择是两个定义Process接口本身的方法:

IMyInterface {
    public string Process();
}

现在,您的两个类通过以下方式实现这一点:

class MyObj1 : IMyInterface {
    public string Process() { return "did one" ; }
}

因此,您甚至不必将该实例传递给该方法。

为什么不使用带有类型约束的开放泛型?不需要铸造,不需要工厂类或任何黑客

public string Process<T>(T obj)
  where T : IMyInterface
{
    ...
}

称呼它为喜欢

IMyInterface obj = new MyObj1();
var s = Process(obj);

如预期的那样。

最新更新