方法使用实现相同接口的对象进行重载

时间:2016-01-25 09:31:25

标签: c# inheritance overloading

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

  

编译错误:无法转换为' UserQuery.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();
}

2 个答案:

答案 0 :(得分:4)

您必须明确地将obj强制转换为MyObj1,因为编译器不知道您将该类的实例分配给obj

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

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

更好的appraoch将在您的界面本身定义方法Process

IMyInterface {
    public string Process();
}

现在你的两个类通过以下方式实现:

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

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

答案 1 :(得分:0)

为什么不在type constraints使用开放式泛型?不需要铸造,不需要工厂类或任何 hacky

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

称之为

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

按预期。