如果类(或结构)选择通过支持接口来扩展功能,就需要在其类型定义中使用逗号分隔的列表。要知道,直接基类必须是冒号操作符后的第一个项。如:public class Pencil:Ipointy{...}public class Fork:Utensil,Ipointy{....}注意:实现接口是一个“要么全要,要么全部要”的命题,也就是说支持类型无法选择实现哪些成员。例如: class Triangle : IPointy //在此处,右键点击实现接口,则会自动将接口中的内容实现。修改实现体就可以达到我们想要实现的效果。(如果实现多个接口并且有重复的名字的成员,可以通过显式实现接口解决。) { public byte Ponits { get { return 6; } } public byte GetNumberOfPoints() { Console.WriteLine("Interface!"); return 0; } }
四、在对象级别调用接口成员
Triangle类已经实现了IPointy 接口,有了Points属性,用法如下:运行结果如下:这种情况下,是没有问题的,但是如果一个类没有实现接口,调用Points属性的时候,就会出现编译错误。因此,有的时候就需要判断一个类型支持哪些接口,就用到了下面的方法:1、try-catch逻辑,接口强制转换中如果不支持这个接口,就会出现无效转换异常(InvalidCastException)。(不是最好的)2、获取接口引用:as关键字。例如新的类型A判断则可以如下:A a=new A();IPointy ips= a asIPointy ;//接下来判断ips是不是为空,然后输出其Points属性。3、获取接口引用:is关键字用法:if(a isIPointy){Console.Write((IPointy)a.Points);}else //...
五、接口作为参数
用法如下:
六、接口作为返回值
接口也可以用作方法的返回值。用法如下:结果:
七、接口类型数组
同样的类型可以由多个类型实现,即使这些类型不处于相同的类层次结构中,并且除System.Object以外,也没有其他的公共父类。这可以产生出许多非常强大的编程结构。如果已经定义了A,B,C类型,那么现在可以定义一个支持IPointy接口的对象数组:IPointy[] myPionty = {new A(), new B(), new C()};foreach(IPointy i in myPointy){Console.Write(i.Ponits);}
之前提到过,System.Object定义了一个名为MemberwiseClone的成员。这个方法用来获取当前对象的一份浅复制。因为它是受保护的,对象用户不会直接调用到这个方法,而一个对象可能在克隆过程中自己调用这个方法。之前还提到的引用类型和值类型里面有,如果给一个引用变量分配另一个引用变量,将有两个引用指向内存中同一个对象,对其中一个的操作,将会将两个引用全部改变。如果想要使自己自定义类型支持向调用方法返回自身同样副本的能力,需要实现标准的ICloneable接口。使用方法:class A:ICloneable{ public object Clone(){return new A();}//实现的Clone方法返回当前对象的一个副本。}用的时候:static void Main(){ A a = new A(); A b = (A)a.Clone();//这种情况下,当修改b内的成员的时候,a内的成员不会被改变。}对于更深层次的复制,在这里不做过多陈述。
十一、构建可比较的对象
System.IComparable接口指定了一种允许一个对象可基于某些特定键值进行排序的行为。接口正式定义:public interface IComparable{ int CompareTo(object o);}代码如下:构建自定义类型的时候,可以实现IComparable以使得该类型数组可被排序,充实CompareTo的细节时候,需要决定排序操作的基准。修改代码如下:下面是main函数的代码:运行结果:除此之外,我们还一颗指定多个排序顺序,以及自定义属性和自定义排序类型。在此不再陈述。