2

是否有可能以某种方式实现以下方案:

public interface ISomething
{
    void Go(ISpecific specific);

    void Go(Object o);
}

这样在每次Go(ISpecific)调用时都会调用第一个重载,并且对于带有任何其他可能对象的调用,该类将回退到实现Go(Object)

4

4 回答 4

5

是的。这就是编译器的工作方式。

于 2011-04-27T14:11:41.397 回答
5

这就是默认情况下的工作方式 - 但使用编译时类型。如果你有Go(foo)并且编译时类型foo没有实现ISpecific,即使foo在执行时引用的对象实现了,它也会调用第二种方法ISpecific如果您希望在执行时动态做出此决定,并且您使用的是 C# 4,则可以编写:

dynamic value = GetValue();
something.Go(value);

...在执行时,将选择正确的重载。

于 2011-04-27T14:16:06.463 回答
3

是的,可以这样做。请注意,将根据引用的编译时类型来决定采用哪个重载。

ISpecific specificVar = null;
something.Go(specificVar);  // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj);  // ISomething::Go(object)
于 2011-04-27T14:17:48.147 回答
0

是的,它确实有效,任何不是 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");
    }
}
于 2011-04-27T14:40:11.570 回答