C#中接口问题

来源:互联网 发布:苹果怎么开4g网络 编辑:程序博客网 时间:2024/04/29 19:39
interface IA   //接口IA

  void F();   //接口IA 方法;
}
class A:IA   //类A继承于接口IA
{  
 void IA.F()   //接口IA的方法F(), 前面不可有public或者其他修饰符.   
 {    
  Console.Write("IA.F()"); 
  }   
public void F()  //类A的方法F();  
{    
 Console.Write("A.F()"); 
  }
}
class B:A, IA    //类B继承于类A, 而且又继承于接口IA.

new  public void F()   //类B的方法. 
  {    
  Console.Write("B.F()");  
 }
}
class Test
{  
 public static void Main() 
 {    
  A c=new B();   //新建一个类B, 并将此类B强制赋予类A的实例c.     
 ((IA)c).F();  //写出实例c的IA接口的方法F(). 
  }
}

结果:B.F()
结论: 如果有继承的父类并且映射到接口,而且此类也映射到和父类相同的接口, 如上. 这个时候就应该忽略父类的映射接口的影响.而是直接从接口中得到.

范例2:改写 A c=new B();
                    c.F();
结果:A.F()

结论:新建类B(),并将它赋予类A的实例c, 所以只能是类A中的方法.如果类B()中有一个方法叫G(), 类A中没有, 若执行c.G()这个时候会弹出错误,说明实例c所对应的类A没有方法G(). 所以对于这种情况一定认清前面的类A为对象实例的类, 而不是后面的类B.

using System;
interface IA  
{
    void F(); 
}
class A:IA  
{
    void IA.F()          //-----Interface IA  method F() implement
     {
       Console.Write("IA.F()");
    }
    public void F()    //------class A method F().
   {
      Console.Write("A.F()");

    }
}
class B:A   
{
    new public void F() 
    {
       Console.Write("B.F()");
    }
    public void G()
    {
        Console.Write("B.G()");
        }
}

class Test
{
    public static void Main()
   {
       A c=new B(); 
       c.F(); 
    }

}

Result:
A.F()

结论: 此时类A的实例c, 直接从A的方法F()调用出来.

范例二:
如果将
A c=new B();
((IA)c).F();

结果是:
IA.F()
结论是此时会从类A中接口的IA方法调用出来.
原创粉丝点击