本文学习接口。
本人目前对接口的理解 :
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( "集成接口做一些事情") ; } } }
接口的学习到此为止,泛型接口需要到学习了泛型在进行了解
接口的学习到此为止,泛型接口需要到学习了泛型在进行了解