我正在处理如下界面:
public interface ISomething
{
...many auto-props,
void SetValues(ISomething thing)
}
现在,我不拥有此界面,但我想用更多属性扩展它:
public interface ISomethingMoreSpecific : ISomething
{
...existing + my props,
void SetValues(ISomething thing)
}
在类ISomethingMoreSpecific
中,我实现了一个重载,它接受派生接口并处理我的props和基本接口属性。
public void SetValues(ISomethingMoreSpecific specificThing)
{
...set my props and base props
}
调用代码执行以下操作:
myThing.SetValues((ISomethingMoreSpecific)otherThing);
无论有没有强制转换,即使otherThing
和myThing
是实现ISomethingMoreSpecific
的具体类型,该方法也不会调度到我的重载。我猜我忽略了一些简单的东西,但它是什么?
答案 0 :(得分:2)
包括
void SetValues(ISomethingMoreSpecific specificThing);
进入ISomethingMoreSpecific。
答案 1 :(得分:0)
void SetValues(ISomething thing)
再次ISomethingMoreSpecific
。您是否打算隐藏它,然后使用new
关键字。如果您不想隐藏,则需要在void SetValues(ISomething thing)
中将void SetValues(ISomethingMoreSpecific)
更改为ISomethingMoreSpecific
。下面是您打算隐藏的代码,它可以用于强制转换。即使您没有隐藏它,也就是说不要使用new
关键字。它有效。
public class Program
{
public void Main(string[] args)
{
MyThing a = new MyThing();
MyThing b = new MyThing();
a.SetValues(b);//calls more specific
a.SetValues((ISomething)b);//calls just the thing
}
}
public class MyThing : ISomethingMoreSpecific
{
public void SetValues(ISomethingMoreSpecific specificThing)
{
Console.WriteLine ("more specific");
}
public void SetValues(ISomething thing)
{
Console.WriteLine ("just the thing");
}
}
public interface ISomethingMoreSpecific : ISomething
{
//...existing + my props,
new void SetValues(ISomething thing);
}
public interface ISomething
{
//...many auto-props,
void SetValues(ISomething thing) ;
}