C#中抽象类与接口的分析与比较

2013-01-29 08:35宿迁经贸高等职业技术学校毛广敏
电子世界 2013年10期
关键词:实例声明对象

宿迁经贸高等职业技术学校 毛广敏

C#中抽象类与接口的分析与比较

宿迁经贸高等职业技术学校 毛广敏

抽象类和接口是C#语言中两个重要的对象引用类型,是C#程序设计使用多态性的基础,但也是初学者容易搞混淆的两种类型,本文主要介绍了两者的概念、特点和典型应用实例,并对两者进行比较。

抽象类;接口;分析;区别

抽象类和接口是C#语言中两个重要的对象引用类型,是C#程序设计使用多态性的基础,但也是初学者容易搞混淆的两种类型,本文主要介绍了两者的概念、特点和典型应用实例,并对两者进行比较。通过本文的介绍能使得初学者掌握抽象类和接口概念、特点和使用场合。

一、抽象类

在类声明中使用abstract修饰符的类称为抽象类。含有一个或一个以上的抽象成员的类,必须定义为抽象类。当方法声明包含abstract修饰符时,称该方法为抽象方法,虽然抽象方法同时隐含为虚拟方法,但是它不能有virtual修饰符。声明中包含abstract修饰的属性称为抽象属性。抽象方法或属性没有方法体或属性访问器。抽象类只能是其他类的基类,抽象类不能实例化,必须在继承中实现。抽象类中可以包含非抽象成员。抽象类的目的是提供一个合适的基类,以派生其他的类。使用抽象类的好处之一是,当要求组建新版本时,可根据需要将附加方法添加到基类。如下例:

抽象类应用实例:

从上面的例子可以看出在程序中声明了一个抽象类animal,在该类中声明了一个抽象方法FoodHabits(),该方法没有形参,无返回值。Carnivorous和Herbivorous是animal的派生类,在这两个派生类中必须重写FoodHabits()方法,否则会发生编译错误,重写方法的关键字是override。在主函数中不可以创建基类animal的实例,但可以将实现抽象类的对象赋给抽象类的对象。

二、接口

在C#中类只能实现“单一继承”,要实现多重继承,必须使用接口。一个接口定义一个协定,实现接口的类或结构必须遵守其协定。接口可以从多个基接口继承,而类或结构可以实现多个接口中。接口声明可以声明零个或多个成员,接口的成员必须是方法、属性、事件或索引器。接口不以包含常数、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。接口本身不提供它所定义的成员的实现,接口只指定实现该接口的类或接口必须提供的成员。所有接口成员都隐式地具有public访问权限。类可以从单个类继承但可以实现多个接口,实现接口的类需要实现接口的所有成员。接口可以从现有接口中继承,一个实现接口的类也实现它的继承接口的基类接口。

虽然不能创建接口对象,但可以声明接口变量,接口变量必须指向一个实现了接口的类的对象。如下例中的TypeUse[]t=new TypeUse[4];声明了一个接口类型的数组,它包含4个接口类型的变量。以下语句声明了类的对象,并实例化,接口变量(接口数组元素)指向类的对象。

以上语句说明不同类型的对象被分配给一个接口引用。以下程序中应用程序通过接口引用数组调用Showinfo方法,并返回结果,在Showinfo方法中引用Type属性和调用TellAboutSelf方法,不同对象及其属性、方法关联在一起,因此,在引用Type属性和调用TellAboutSelf方法时,不必考虑是哪一个对象,这也是多态行为的典型示例。

三、接口实现“多重继承”

四、抽象类和接口的比较

从上面两个关于抽象类和接口的例子中可以看出抽象类和接口相似的地方和区别。

(一)相同点

1.抽象类和接口都包含可以由派生类继承的成员,两者都不能直接实例化。

2.两者都可以被继承。3.两者都不能被实例化。4.都可以包含方法声明。

5.派生类必须实现未实现的方法。

(二)区别

1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类。而接口只是一个行为的规范或规定。

2.抽象类是一种不能实例化而必须从中继承的类。抽象类可封装继承类的通用不变的功能,但也可通过实现抽象类的抽象方法和属性为继承类提供其不同的功能。在抽象类中可以包含非抽象成员。接口是完全抽象成员集合,可以被看作是为操作定合同。如果类实现了一个接口,必须实现接口把定义的所有成员。

3.抽象类的派生类也必须重写抽象类中的抽象方法或属性。抽象类中的成员没有限制,但接口中的成员必须是方法、属性、事件或索引器。所有接口的成员都是隐式具有public访问权限,并且不能显式的声明接口成员的访问权限,而抽象的成员的访问权限需指定。

五、抽象类和接口的使用场合

1.如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。

2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。

3.如果要设计大的功能单元,则使用抽象类,如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。

4.抽象类主要用于关系密切的对象,而接口适合为不相关的类提供通用功能。

本文通过对抽象类和接口概念、特点、典型应用实例、比较分析及使用场合的介绍,相信能对初学者有所帮助。

[1]陈锐.C#程序设计(高等学校计算机科学与技术教材)[M].2012.

[2]杜少杰,王文红.C#程序设计案例教材[M].2010.

[3]胡湘萍.C#中接口与抽象类的应用辨析[J].2010.

毛广敏(1978—),女,江苏沭阳人,宿迁经贸高等职业技术学校讲师。

猜你喜欢
实例声明对象
本刊声明
本刊声明
涉税刑事诉讼中的举证责任——以纳税人举证责任为考察对象
本刊声明
本刊声明
攻略对象的心思好难猜
基于熵的快速扫描法的FNEA初始对象的生成方法
区间对象族的可镇定性分析
完形填空Ⅱ
完形填空Ⅰ