C# 接口的学习

来源:互联网 发布:java常用设计模式区别 编辑:程序博客网 时间:2024/04/25 11:51

本文学习接口。 

本人目前对接口的理解 :

A 定义了一个规范,所以集成这个接口的类都需要实现她指定的方法。

B 接口可以被集成吗 ? 【接口是可以被继承的

C 如果父类和子类继承了同一个接口 ,需要显示的定义接口,这里需要研究一下【如果父类的接口用virtual来修饰,那么子类可以重写这个函数,如果sealed的,那么只能重写定义这个接口方法了,继承类冲洗集成这个接口,然后使用new重新定义这个方法。】

D 接口的基本特性 : 是一组命名的方法签名,属性,事件本质上是方法,所以也可以被集成。 

E 在类中实现接口中的方法,需要用public 来进行修饰。 需要用virtual来修饰。 否则就会默认是private 和sealed的,不能被继承类重写了。参考c条记录。

上边的知识可以参考代码如下 

using System;using System.Data;using System.Text;namespace  myStu{/**/class programe{   static void Main(string[] arg){try{                 baseClass  obj = new baseClass() ;obj.dothing() ;sonclass obj1 = new sonclass() ;obj1.dothing() ;}catch (Exception err){Console.WriteLine(err.Message);}}}interface Ido{//接口是不允许使用访问限制符的,为什么那, : 防止程序员随意更改访问的限制符号,都是public的。public void dothing() ;void dothing1() ;}    class baseClass :Ido     {public  virtual void dothing() {Console.WriteLine( "集成接口做一些事情") ;}public void dothing1(){Console.WriteLine("默认是virtual and sealed 的,不能被重写,这个时候继承类可以重新实现这个接口") ;}    }class sonclass : baseClass ,Ido  //注意 这里虽然用接口进行限定,但是因为基类已经实现了这两个方法,所以子类已经有了这两个方法,也可以被认为子类已经实现了接口的签名方法。{public  override void dothing() //重写{Console.WriteLine( "继承类集成接口做一些事情") ;}public new void dothing1()//重新实现这个接口{Console.WriteLine( "继承类重新实现了接口") ;}}class baseClass1 :Ido     {//protected   void dothing()    //这样写错误的     public    void dothing()    //这样写正确的,必须是public //InterfaceStu.cs(51,8): error CS0737: 'myStu.baseClass1' does not implement interface member 'myStu.Ido.dothing()'. 'myStu.baseClass1.dothing()' cannot implement an interface member because it is not public.{Console.WriteLine( "集成接口做一些事情") ;} //protected   void dothing()    //这样写错误的     public    void dothing1()    //这样写正确的,必须是public //InterfaceStu.cs(51,8): error CS0737: 'myStu.baseClass1' does not implement interface member 'myStu.Ido.dothing()'. 'myStu.baseClass1.dothing()' cannot implement an interface member because it is not public.{Console.WriteLine( "集成接口做一些事情") ;}    }}

接口方法的调用

接口的实例可以调用接口里面的所有的方法,但是不能调用类实例里面的方法。
类实例里面的方法可以调用类实例里面的所有的方法,包含接口类型里面的方法,下边的代码说明了这个情况。
using System;using System.Data;using System.Text;namespace  myStu{/**/class programe{   static void Main(string[] arg){try{                 baseClass  obj = new baseClass() ;obj.dothing() ;obj.say() ; //正确的用法Ido iobj1 = obj;iobj1.dothing() ;Ido iobj = new baseClass() ;//iobj.say() ; // 这里用是错误的,因为say方法不是在在接口里面定义的。iobj.dothing() ;// 这里是正确的,因为dothing方法在接口里面进行定义了sonclass obj1 = new sonclass() ;obj1.dothing() ;}catch (Exception err){Console.WriteLine(err.Message);}}}interface Ido{//接口是不允许使用访问限制符的,为什么那, : 防止程序员随意更改访问的限制符号,都是public的。public void dothing() ;void dothing1() ;}    class baseClass :Ido     {public  void say(){Console.WriteLine("说话了,此方法如果是在IDO类型进行调用 ,是不能被调用的,可以试验一下") ;}public  virtual void dothing() {Console.WriteLine( "集成接口做一些事情") ;}public void dothing1(){Console.WriteLine("默认是virtual and sealed 的,不能被重写,这个时候继承类可以重新实现这个接口") ;}    }class sonclass : baseClass ,Ido  //注意 这里虽然用接口进行限定,但是因为基类已经实现了这两个方法,所以子类已经有了这两个方法,也可以被认为子类已经实现了接口的签名方法。{public  override void dothing() //重写{Console.WriteLine( "继承类集成接口做一些事情") ;}public new void dothing1()//重新实现这个接口{Console.WriteLine( "继承类重新实现了接口") ;}}class baseClass1 :Ido     {//protected   void dothing()    //这样写错误的     public    void dothing()    //这样写正确的,必须是public //InterfaceStu.cs(51,8): error CS0737: 'myStu.baseClass1' does not implement interface member 'myStu.Ido.dothing()'. 'myStu.baseClass1.dothing()' cannot implement an interface member because it is not public.{Console.WriteLine( "集成接口做一些事情") ;} //protected   void dothing()    //这样写错误的     public    void dothing1()    //这样写正确的,必须是public //InterfaceStu.cs(51,8): error CS0737: 'myStu.baseClass1' does not implement interface member 'myStu.Ido.dothing()'. 'myStu.baseClass1.dothing()' cannot implement an interface member because it is not public.{Console.WriteLine( "集成接口做一些事情") ;}    }}

接口的显式定义和隐式实现 ?

先看看clr中对接口的方法,和类中的方法是如何工作的吧!

clr 引入一个类型的时候会为每个方法都声称一条记录。  如果类型添加的方法,和实现接口的方法是一样的,那么这两条记录都指向同一个实现内存。
如果显式的定义了接口的实现方法,那么这两条记录指向的就不是同一个实现内存了,而是两个  通过下边的代码来进行演示。

using System;using System.Data;using System.Text;namespace  myStu{/**/class programe{   static void Main(string[] arg){try{                 baseClass  obj = new baseClass() ;obj.dothing() ;obj.say() ; //正确的用法Ido iobj1 = obj;iobj1.dothing() ;Ido iobj = new baseClass() ;//iobj.say() ; // 这里用是错误的,因为say方法不是在在接口里面定义的。iobj.dothing() ;// 这里是正确的,因为dothing方法在接口里面进行定义了sonclass obj1 = new sonclass() ;obj1.dothing() ;}catch (Exception err){Console.WriteLine(err.Message);}}}interface Ido{//接口是不允许使用访问限制符的,为什么那, : 防止程序员随意更改访问的限制符号,都是public的。public void dothing() ;void dothing1() ;}    class baseClass :Ido     {public  void say(){Console.WriteLine("说话了,此方法如果是在IDO类型进行调用 ,是不能被调用的,可以试验一下") ;}public  virtual void dothing()    //clr 中的元数据表 接口的发那个发,和这个方法的指向的是同一个方法实现{Console.WriteLine( "集成接口做一些事情") ;}void Ido.dothing(){   Console.WriteLine("接口的方法需要做的一些事情") ;  //这个是接口的显示定义  只能是private的,不能是public的。防止类的实例调用这个方法,只能是接口的实例调用这个方法。}public void dothing1(){Console.WriteLine("默认是virtual and sealed 的,不能被重写,这个时候继承类可以重新实现这个接口") ;}    }class sonclass : baseClass ,Ido  //注意 这里虽然用接口进行限定,但是因为基类已经实现了这两个方法,所以子类已经有了这两个方法,也可以被认为子类已经实现了接口的签名方法。{public  override void dothing() //重写{Console.WriteLine( "继承类集成接口做一些事情") ;}public new void dothing1()//重新实现这个接口{Console.WriteLine( "继承类重新实现了接口") ;}}class baseClass1 :Ido     {//protected   void dothing()    //这样写错误的     public    void dothing()    //这样写正确的,必须是public //InterfaceStu.cs(51,8): error CS0737: 'myStu.baseClass1' does not implement interface member 'myStu.Ido.dothing()'. 'myStu.baseClass1.dothing()' cannot implement an interface member because it is not public.{Console.WriteLine( "集成接口做一些事情") ;} //protected   void dothing()    //这样写错误的     public    void dothing1()    //这样写正确的,必须是public //InterfaceStu.cs(51,8): error CS0737: 'myStu.baseClass1' does not implement interface member 'myStu.Ido.dothing()'. 'myStu.baseClass1.dothing()' cannot implement an interface member because it is not public.{Console.WriteLine( "集成接口做一些事情") ;}    }}

接口的学习到此为止,泛型接口需要到学习了泛型在进行了解

原创粉丝点击