为什么对象可以在upcast之后看到方法的实现?

时间:2016-05-05 08:58:00

标签: c#

为什么i可以致电Method?它无法看到Method的实施,只有声明,不是吗?它同时是upcast和拳击..还是没有?

interface IB
{
    void Method();
}

struct A : IB
{
    public void Method() { Console.WriteLine("1"); }
}

class Program
{
    static void Main()
    {
        A a;
        a.Method();
        IB i = a;   // boxing.. and upcast?
        i.Method(); // why it works? It looks like call of declaration
    }
}

工作结果:

  

1

     

1

3 个答案:

答案 0 :(得分:1)

看起来您正在创建A的实例,然后在A中调用方法,然后将IB(i)声明为A的实例并再次调用其方法

答案 1 :(得分:1)

当您将对象分配给接口i的实例时,您只是隐藏a对象中与接口定义不匹配的任何其他内容。

相反,我们假设你的结构是

struct A : IB
{
    public void Method() { Console.WriteLine("1"); }   // Method defined in interface IB. 

    public void Method2() { Console.WriteLine("2"); }  // Method only in A
}

class Program
{
    static void Main()
    {
        A a;
        a.Method();
        a.Method2();  // This works. 
        IB i = a;
        i.Method();
        i.Method2();// This fails to compile because Method2 isnt defined in the interface. 
    }
}

答案 2 :(得分:1)

A的实例实现接口IB,也就是说,类A的任何实例也是接口IB的类型,因此它是完全合法的将A的对象分配给IB。没有铸造。没拳击。是的,正如@CathalMF所说,你只能从这个对象中调用IB接口中的内容。