C#中接口与抽象类的应用辨析

时间:2022-09-09 07:55:29

C#中接口与抽象类的应用辨析

摘 要:在用C#编程语言开发软件的过程中,接口与抽象类是两个不容易辨析的概念。它们的成员都是抽象的,都需要子类去实现,但作用不同,本文从实际应用的角度,辨析这两个重要概念。

关键词:接口 抽象类 成员 继承

中图分类号:TP39 文献标识码:A文章编号:1007-3973 (2010) 02-062-02

2000年9月,ECMA为C#定义了一个Microsoft建议标准,从而使C#成为微软.NET平台上量身定做的开发语言。C#的简单、安全、面向对象等特征,使其迅速成为目前市场上开发软件流行的编程语言。C#中类的单一继承使其较C++语言更稳定。C#不支持多重继承,但客观世界多重继承的情况又比较多,为了避免传统的多重继承给程序带来的复杂性等问题,同时保证多重继承带给程序员的诸多好处,C#提出了接口概念,通过接口实现多重继承。接口定义类要实现的一系列方法,而本身并不实现这些方法,只是以逻辑结构方式描述它们。而这种特性与抽象类又极为相似。

1接口的概念

接口是一种用来定义程序的协议,实现接口的类要与接口的定义严格一致。接口由方法、属性、事件和索引器或这四种成员的任何组合构成。接口声明的语法格式如下:

[修饰符] interface 接口名称:[继承的接口列表]

{//接口内容

}

其中,除了infterface和接口名称,其它都是可选项。而接口内容主要是接口的各项成员的声明。每个成员都不包括具体实现细节。

另外,接口有如下特性:

接口成员必须是方法、属性、事件或索引器。接口不能包含常数、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。且所有成员都隐式地具有public访问属性,声明时不需要任何修饰符,否则会出现编译错误。一个类可以直接继承多个接口,但只能直接继承一个类。好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。接口的成员包括从基接口继承的成员和由接口本身声明的成员。如下例子,我们创建一个接口,功能是生成一系列数字:

public interface INumber

{int Next();//返回系列中的下一个数字

void reSet();//重新开始

void Start(int x);//设置初始值}

2 接口的使用

接口定义了后就可使用,在类定义时指定要实现的接口名。格式如下:

[修饰符] class 类名[:接口列表]

{//类实体

}

实现接口的方法必须声明为public,且必须与接口中定义一样。下面通过一个范例介绍如何实现接口及接口的应用。

主函数代码如下:

CNumber number=new CNumber();

Console.WriteLine("执行Next()方法在原数值上加2");

for(int i=0;i

number.reSet();

Console.WriteLine("执行reSet()方法重置初始值为0及Next()方法");

for(int i=0;i

number.Start(100);

Console.WriteLine("执行Start()方法重置初始值为100及Next()方法");

for(int i=0;i

CNumber类的定义如下:

class CNumber:INumber//接口INumber的定义如上面代码

{ int start;int val;

public CNumber(){start=0;val=0; }

public int Next(){val+=2; return val; }

public void reSet(){start=0; val=0; }

public void Start(int x){ start=x;val=x; }

}

运行结果如右图。

3抽象类的概念与使用

抽象类也是类的一种,定义也符合类定义的一般形式,只不过定义时,增加了一个修饰符abstract。抽象类是特殊的类,只是不能被实例化,除此以外,具有类的其他特性。但是对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

4接口与抽象类的异同

4.1相似之处

接口是引用类型的,类似于类,和抽象类的相似之处有三点:

不能实例化;包含未实现的方法声明;派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员,不仅是方法,还有其他成员。

4.2抽象类和接口的区别

类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做……”.省略中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。

4.3抽象类和接口的使用注意事项

如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类主要用于关系密切的对象,而接口适合为不相关的类提供通用功能。

5结束语

抽象类,再抽象也还属于类的范畴,它能包含一个类能包含的任何东西,而接口已经不属于类了,它是类的抽象。除了直接实例化以外,可以像使用普通类一样使用抽象类。而对于接口,几乎没有直接与之通信的可能性,因为它几乎不提供具象的东西,它是一种极端的抽象。

参考文献:

[1]张跃廷,许文武,王小科.C#数据库系统开发完全手册[M].人民邮电出版社,2006(12).

[2]吕双,王小科.C#程序设计标准教程[M].人民邮电出版社,2009(3).

[3](美)Stephen C.Perry 著,肖斌 王小振 等译.C#和.NET核心技术[M].机械工业出版社,2007(3).

上一篇:校园无线网络认证设计浅谈 下一篇:基于分步解码的空时分组码研究