c#过载问题
本文关键字:问题 | 更新日期: 2023-09-27 17:53:30
是否有可能以某种方式实现以下方案:
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)
是的,它绝对有效,任何不是isspecific的对象都会调用该对象重载。
我写了一个控制台应用程序来检查。
输出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");
}
}