您的位置:首页 > 其它

CLR笔记:14.接口

2007-09-26 16:34 204 查看
CLR以及所有托管语言都不支持多继承,通过接口模拟实现

14.1 类和接口的实现

接口定义:为一组方法签名指定一个名称的方式。

类实现接口,就一定要提供接口所有方法的实现。

即使抽象类,也要全部实现,但是,它可以把接口方法声明为abstract的,从而把这个接口方法留给派生类去实现,如下:

public interface ITest

public abstract class AbstractClass : ITest

public class ConcreateClass : AbstractClass

//String实现了Icloneable, IEnumerable

String s = "Jax";

ICloneable cloneable = s;

IEnumerable enumable = (IEnumerable)cloneable;
注:cloneable只可使用ICloneable的接口方法,不可以使用String的方法;enumable变量虽由ICloneable转型而来,但也不能使用ICloneable接口方法。

值类型也可以实现接口,但是在转成接口类型前要先装箱——接口变量必须是指向堆上的一个对象的引用。

//Int32实现了IFormattable接口

Int32 i = 0;

//i在转成接口类型前要先装箱

IFormattable formattable = (IFormattable)i;
14.5 接口方法的隐式/显示实现

接口方法一般都是隐式实现的,可访问性一定要声明为public。

EIMI:显示接口方法实现,用定义方法的那个接口的名称来作为方法名称的前缀。

不属于类型对象的一部分,只是将一个接口连接到类型上,同时避免了暴露行为和方法

不能指定可访问性public/private——在IL中标记为为private,只有通过接口变量才能访问该方法,以防止类型对象直接访问。

不能标记为virtual,不能被重写。

public interface ITest

public class TestClass : ITest

TestClass t = new TestClass();

t.Test(); //输出1

ITest it = (ITest)t;

it.Test(); //输出2

14.6 泛型接口

3个好处

1.编译时的类型安全性

Int32 x = 1;

String s = "1";

IComparable c = x;

c.CompareTo(x);

c.CompareTo(s); //运行期错误,因为Object是不安全类型

IComparable<Int32> cc = x; //强类型,所以直接受整型x,不接受字符串s,否则编译期报错

2.操作值类型时减少装箱

上个例子将x传到Compare方法要装箱,使用泛型不用装箱,按值传递。

非泛型现在仍存在于FCL,是为了向后兼容。

3.同一个类可以实现同一个泛型接口若干次,只要使用不同类型参数
public sealed class Number : IComparable<Int32>, IComparable<String>

struct SomeValueType : IComparable

SomeValueType v = new SomeValueType();

Object o = new Object();

Int32 n = v.CompareTo(v); //类对象v的Comapre方法,保证类型安全

IComparable c = v;

n = c.CompareTo(v);

n = c.CompareTo(o); //接口对象c的Comapre方法,不能保证类型安全,所以不要使用接口对象

14.10 EIMI的缺点

3个缺点:

1.没有说明具体如何实现一个EIMI方法

2.值类型实例在转换为接口类型时,会被装箱

3.EIMI方法不能被派生类型继承

14.11 接口与类继承

类继承: 表示 IS-A。易于使用,不必提供所有实现;可以override和new重写;易于在基类中添加成员,而不需改动子类

接口: 表示 CAN-DO。以上类继承的优点一概没有。

值类型继承自System.ValueType,只能使用接口

FCL的集合基于接口,因为各种集合间极少共享的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: