《.NET程序员面试秘笈》----面试题10 接口和抽象类该如何取舍

面试题10 接口和抽象类该如何取舍

.NET程序员面试秘笈
【考点】抽象类的理解,抽象类和接口的区别。

【出现频率】

【解答】

接口和抽象类非常相似,两者都无法实例化,并且未实现部分都由派生类实现,其应用模型如图1.14所示。

结合图1.14可知,接口与抽象类的主要区别有以下几点:

(1)抽象类只能派生类,而接口可以派生类和结构。

(2)抽象类的派生类也可以是抽象类,即抽象成员在派生类中不一定被完全实现。而接口要求其派生类或结构必须完全实现其成员。

(3)抽象类可以包含已经实现的成员,可以包含字段,而接口只包含未实现的成员,不能包含字段。并且接口及所含成员必须为public访问级别。

(4)类只能继承一个抽象类,但可以继承(实现)多个接口。

在具体的程序设计中,抽象类和接口的取舍应视程序的需要而定。抽象类可以用于归纳一组相似的、有共同特性的类,然后将这些类共同的成员提取到抽象类中,使抽象类作为这组类的基类。这样做到了代码的复用,不但节约了代码量,也减轻了维护的复杂度。然后将这组类中相似的方法或属性提取到抽象类中,成为抽象类的抽象成员,不提供具体实现,由这组类自己完成不同的实现。

说明:
抽象类的应用非常类似于网页制作中的CSS外部样式文件,大量风格相同的页面可以共用这个CSS文件,并且在页面中可以对部分CSS属性进行改写。
而接口是一组类的功能集合,也可以说是一组类的协定集合,这组类负责实现这些功能,可以说接口内含的成员都是抽象的。类可以实现多个接口,这样可将意图和实现分离,接口可以暴露给其他程序直接使用,并且可以很方便地进行功能的扩展。两者的应用对比如图1.14所示。

本例以Computer为接口,通过PCA类和PCB类实现该接口的功能。在ch01目录下新建一个程序文件,并命名为Abstract.cs,编写代码如程序1.11所示。

在命令行下编译Abstract.cs后,执行Abstract程序,其效果如图1.15所示。

https://yqfile.alicdn.com/815a6d43015ae8430def24d12763e6fae330d9d7.png" >

本例代码中声明了名为Person的抽象类,类体中声明了两个抽象成员(1个方法和1个属性),Jacky类和Femal类继承了Person类。而Femal类只实现了抽象属性,所以Female必须仍然是抽象类,并且编写了Mariah类继承Female类,Mariah类实现了所继承的抽象方法。而Jacky类完全实现了Person类的抽象成员,所以Jacky类可以不是抽象类,可以创建实例。

程序运行时,创建Jacky类的实例a,并直接输出其_msg字段,还调用了a的getname方法,并访问了ismale属性。然后创建Mariah类的实例b,并进行相同的操作。从程序结果中可看出,Person抽象类的_msg字段为所有派生类的可复用字段,是派生类共同的部分。只有完全实现了Person类抽象成员的类才可以不是抽象类,如Jacky类,而没有完全实现的类如Female类仍然为抽象类。

【分析】

抽象类是一种用abstract关键字修饰的类,这种类仅用于被继承。类似于接口,抽象类无法创建实例,而类体可以声明多个未实现的抽象成员,这些成员由继承此类的派生类实现。其编写方法如以下代码所示:

abstract 类名称
{
 abstract 方法声明;
 abstract 属性声明;
 其他类成员声明及实现;
}

可见,抽象类的类体中可包含实现的成员,而未实现的成员为抽象成员。抽象方法或属性本身就是隐性的virtual,所以派生类实现抽象方法或属性必须使用override关键字。继承抽象类的类如果没有完全实现抽象成员,仍然只能是抽象类,即派生的非抽象类必须完全实现抽象成员。抽象类也可以实现接口,这时抽象类必须实现所有的接口成员,也可以将继承的接口成员映射至抽象成员,并由其派生类来实现。

说明:
抽象类的抽象成员不能使用virtual或static修饰。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-09-20 05:52:24

《.NET程序员面试秘笈》----面试题10 接口和抽象类该如何取舍的相关文章

《C和C++程序员面试秘笈》——1.10 标准头文件的结构

1.10 标准头文件的结构 C和C++程序员面试秘笈为什么标准头文件都有类似以下的结构? 考点: 标准头文件中一些通用结构的理解 出现频率: #ifndef __INCvxWorksh #define __INCvxWorksh #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __cplusplus } #endif #endif /* __INCvxWorksh */``` [解析] 显而易见,代码第1.2.10行的作用是防

《Java程序员面试秘笈》—— 1.10 线程局部变量的使用

1.10 线程局部变量的使用 共享数据是并发程序最核心的问题之一,对于继承了Thread类或者实现了Runnable接口的对象来说尤其重要. 如果创建的对象是实现了Runnable接口的类的实例,用它作为传入参数创建多个线程对象并启动这些线程,那么所有的线程将共享相同的属性.也就是说,如果你在一个线程中改变了一个属性,所有线程都会被这个改变影响. 在某种情况下,这个对象的属性不需要被所有线程共享.Java并发API提供了一个干净的机制,即线程局部变量(Thread-Local Variable)

《.NET程序员面试秘笈》----面试题9 举例描述接口的作用

面试题9 举例描述接口的作用 .NET程序员面试秘笈[考点]接口类型的理解,接口在程序中的意义. [出现频率] [解答] 接口在程序设计中的作用为充当类或结构的功能界面,接口的属性.方法等属于抽象描述必须通过类或结构的实现才能使用.接口是使用者只知道接口有些什么功能,却不知道功能如何实现.由谁实现,这给程序的设计留下了很大的灵活性.例如某个项目由多个功能模块组成,每个模块由一个程序员完成,程序员只需编写完模块功能的实现后,留下该模块的接口供其他人使用.其他人在程序中只需直接使用接口的功能,而不必

《.NET程序员面试秘笈》---- 面试题11 举例说明简单工厂模式的作用

面试题11 举例说明简单工厂模式的作用 .NET程序员面试秘笈 [考点]工厂模式的理解,工厂模式在实际应用中的编写. [出现频率] [解答] 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.为了绕过常规对象的创建方法(new运算符创建实例),工厂模式提供一种"封装机制"来减少使用程序和这种"多系列具体对象创建工作"的耦合性. 说明: 这里的程序指客户程序之类的使用者. 简单工厂模式

《.NET程序员面试秘笈》----面试题16 请简述 .NET的命名空间

面试题16 请简述 .NET的命名空间 .NET程序员面试秘笈 [考点].NET的命名空间的基本理解,自定义命名空间的知识,在程序中使用命名空间的各种技巧. [出现频率] [解答] 使用命名空间的方法可以反映程序中的逻辑关系,并且可以有效避免类名冲突.命名空间就是各种类或其他类型名称的逻辑组织方式,而不代表物理组织方式.例如以下代码: System.Windows.Forms.MessageBox.Show("文本内容"); 在执行以上代码时,将跳出一个带有"确定"

《Java程序员面试秘笈》—— 面试题11 使用jar命令

面试题11 使用jar命令 Java程序员面试秘笈 请使用jar命令,将test文件夹压缩成.jar文件,并简述其压缩包的结构. 考点:对于Java程序员来说,更多情况下是使用的集成Java开发工具,例如JBuilder.Eclipse等,而对于最基本的Java编译和常见的命令行工具往往都不熟悉.这个面试题主要考察求职者对于Java命令行基本工具的使用,从而了解求职者对Java编程的熟悉程度. 出现频率: [面试题解析]熟练的Java开发者应该掌握常用的Java命令行工具.求职者应该熟练掌握ja

《Java程序员面试秘笈》—— 面试题12 如何执行mian()方法

面试题12 如何执行mian()方法 Java程序员面试秘笈 利用Java SDK中哪一条命令能够执行test的main()方法? (a)java test (b)javac test (c)java test.java (d)java test.class (e)java test.main 考点:考察求职者对java命令的熟悉程度. 出现频率: [面试题解析]求职者容易出现的错误是选择了(d).实际上,java命令后面只需要class文件的名称就可以,不用加入.class全名.如果使用jav

《.NET程序员面试秘笈》----面试题13 举例说明索引器的作用

面试题13 举例说明索引器的作用 .NET程序员面试秘笈 [考点]索引器的理解,this在索引器中的作用. [出现频率] [解答] 索引器可以使客户程序很方便地访问类中的集合或数组,访问方法类似于通过索引访问数组,并且索引器向客户程序隐藏了内部的数据结构.索引器和属性同样使用get和set访问器读取.写入值,不过索引器的get和set访问器必须具有与索引器相同的形参表.但是属性可以为静态成员,而索引器必须为实例成员.索引器不支持类似于属性的自动实现的语法. 说明: 形参表即为声明索引器时接收的形

《.NET程序员面试秘笈》----第1章 .NET概念题 面试题1 简述面向对象的程序设计思想

第1章 .NET概念题 .NET程序员面试秘笈 本章内容包含面向对象程序设计和.NET的基础概念题,由于这部分题目涉及的范围比较广,因此在很多公司的面试题中占了比较大的比重.很多.NET程序员在编写代码时非常熟练,但往往缺乏对基础知识的深刻理解,从而导致面试失败.这类知识是程序设计的基础,如果不加以重视,程序编写就没有创造性,只能学一步,做一步. 面向对象编程是当前流行的编程方式,被大多数高级语言支持..NET程序同样是基于面向对象的设计,只有深刻理解面向对象的编程理念,才可以开发出结构良好的.

《.NET程序员面试秘笈》----面试题12 访问关键字this和base有什么作用

面试题12 访问关键字this和base有什么作用 .NET程序员面试秘笈[考点]this的理解,base的理解. [出现频率] [解答] this关键字用于引用类的当前实例.base关键字用于派生类访问基类成员. 为了说明this和base在类中的具体应用,在ch01目录下新建一个程序文件,并命名为This.cs,编写代码如程序1.13所示. 程序1.13 this和base示例:This.cs using System; class This { static void Main() { C