是否有可能以某种方式实现以下方案:
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
这样在每次Go(ISpecific)
调用时都会调用第一个重载,并且对于带有任何其他可能对象的调用,该类将回退到实现Go(Object)
?
是否有可能以某种方式实现以下方案:
public interface ISomething
{
void Go(ISpecific specific);
void Go(Object o);
}
这样在每次Go(ISpecific)
调用时都会调用第一个重载,并且对于带有任何其他可能对象的调用,该类将回退到实现Go(Object)
?
是的。这就是编译器的工作方式。
这就是默认情况下的工作方式 - 但使用编译时类型。如果你有Go(foo)
并且编译时类型foo
没有实现ISpecific
,即使foo
在执行时引用的对象实现了,它也会调用第二种方法ISpecific
。如果您希望在执行时动态做出此决定,并且您使用的是 C# 4,则可以编写:
dynamic value = GetValue();
something.Go(value);
...在执行时,将选择正确的重载。
是的,可以这样做。请注意,将根据引用的编译时类型来决定采用哪个重载。
ISpecific specificVar = null;
something.Go(specificVar); // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj); // ISomething::Go(object)
是的,它确实有效,任何不是 ISpecific 的对象都会调用对象重载。
我写了一个控制台应用程序来检查。
它输出
Object
Object
Specific
class Program
{
static void Main()
{
Object aSpecific = new Object();
String nonSpecific = "nonSpecific";
ISpecific specific = new Specific();
ISomething something = new Something();
something.Go(aSpecific);
something.Go(nonSpecific);
something.Go(specific);
Console.ReadKey();
}
}
interface ISpecific
{
void GoGo();
}
interface ISomething
{
void Go(ISpecific specific)
void Go(Object o)
}
Class Specific : ISpecific
{
public Specific() { }
public void GoGo()
{
Console.WriteLine("Specific");
}
}
Class Something : ISomething
{
public Something() { }
public void Go(ISpecific specific)
{
specific.GoGo()
}
public void Go(Object o)
{
Console.WriteLine("Object");
}
}