C#面试:抽象类与接口
本人近日面试遇到此等问题。然后又一次补习了一下下。希望对同行们有所帮助。
|
一、抽象类:
抽象类是特殊的类,仅仅是不能被实例化;除此以外。具有类的其它特性;重要的是抽象类能够包括抽象方法,这是普通类所不能的。抽象方法仅仅能声明于抽象类中,且不包括不论什么实现。派生类必须覆盖它们。 另外,抽象类能够派生自一个抽象类,能够覆盖基类的抽象方法也能够不覆盖,假设不覆盖。则其派生类必须覆盖它们。 二、接口:
接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包括未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是全部成员(不仅是方法包含其它成员); 另外。接口有例如以下特性:
接口除了能够包括方法之外,还能够包括属性、索引器、事件,并且这些成员都被定义为公有的。 除此之外,不能包括不论什么其它的成员。比如:常量、域、构造函数、析构函数、静态成员。一个类能够直接继承多个接口,但仅仅能直接继承一个类(包括抽象类)。 三、抽象类和接口的差别:
1.类是对对象的抽象,能够把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口仅仅是一个行为的规范或规定,微软的自己定义接口总是后带able字段,证明其是表述一类类“我能做。 。。”.抽象类很多其它的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中. 6.抽象类实现的详细方法默觉得虚的,但实现接口的类中的接口方法却默觉得非虚的,当然您也能够声明为虚的. 比方asp.net中,Page类,有Server Request等属性。但事实上他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常主要的一个设计原则。 11.假设抽象类实现接口。则能够把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法. 2.假设创建的功能将在大范围的全异对象间使用。则使用接口。假设要设计小而简练的功能块,则使用接口。 3.假设要设计大的功能单元。则使用抽象类.假设要在组件的全部实现间提供通用的已实现功能,则使用抽象类。 下面是我在网上看到的几个形象比喻,真的很不错,呵呵:
1>飞机会飞。鸟会飞,他们都继承了同一个接口“飞”。可是F22属于飞机抽象类,鸽子属于鸟抽象类。 2> 就像铁门木门都是门(抽象类)。你想要个门我给不了(不能实例化),但我能够给你个详细的铁门或木门(多态);并且仅仅能是门,你不能说它是窗(单继承);一个门能够有锁(接口)也能够有门铃(多实现)。门(抽象类)定义了你是什么。接口(锁)规定了你能做什么(一个接口最好仅仅能做一件事。你不能要求锁也能发出声音吧(接口污染))。 抽象类和接口有什么差别?
简单来说,
接口是公开的。里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是能够有私有方法或私有变量的. 另外。实现接口的一定要实现接口里定义的全部方法,而实现抽象类能够有选择地重写须要用到的方法。一般的应用里,最顶级的是接口,然后是抽象类实现接口。最后才到详细类实现。
还有,接口能够实现多重继承。而一个类仅仅能继承一个超类,但能够通过继承多个接口实现多重继承。接口还有标识(里面没有不论什么方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
接口和抽象类的差别,我认为主要是两点,一个是抽象类里还能够有非抽象的方法,尽管抽象类仍无法实例化。可是其子类能够。也就是说这些非抽象函数仍能够被多态调用。这也是抽象类为什么没有全然被接口代替的原因。接口就是相反了。只是接口也有一个优势是抽象类无法比拟。就是类能够继承多个接口。而抽象类和普通类一样,仅仅能继承一个。所以接口能够解决多重继承问题。
抽象类能够仅仅实现部分方法,接口则必须实现其所有方法。抽象类的方法能够有抽象方法,也能够有普通方法。接口里的方法必须是抽象方法。抽象类的方法的訪问权限能够多种,接口的方法的訪问权限仅仅能是public;抽象类的子类仅仅能继承一个抽象类,而实现接口的类能够同一时候实现多个接口.
笼统点说: 接口 = 定义了要做的全部事情。但自己啥也不干 抽象类 = 做了部分共做,剩下的他不干了,等后来人继续完毕 这就是差别!
抽象类的成员能够具有訪问级别,而接口的成员所有public级别 抽象类能够包括字段,而接口不能够, 抽象类能够继承接口,而接口不能继承抽象类 抽象类的成员能够具有详细实现,而接口不行 抽象的子类能够选择性实现其基类的抽象方法,而接口的子类必须所有实现 |
转自:http://www.360doc.com/content/10/0525/16/1039473_29458325.shtml
C#面试:抽象类与接口的更多相关文章
- 面试问题 - C# 接口和抽象类的区别
这个问题基本上可以说是 面试时的必问问题 C# 中的接口和抽象类 相同点: 1. 都不能直接实例化,都可以通过继承实现其抽象方法 2. 都是面向抽象编程的技术基础,实现了诸多的设计模式 不同点: 1. ...
- java面试记录一:跳表、判断二叉树相同、冒泡排序、cookie和session的区别、设计模式(单例、工厂、模板方法、原型、代理、策略)、抽象类与接口的区别
1.什么是跳表? 跳表实际上就是多层链表 跳表可用在让链表的元素查询接近线性时间 代码结构及java实现参考博客园随笔 2.判断两棵二叉树是否相同?(结构相同,内容相同) 思路:(1)先定义树节点Tr ...
- Java中多态、抽象类和接口
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...
- 抽象类和接口 static final finalize
抽象类 任何含有一个或多个抽象方法的类都必须声明成抽象类,用关键字abstract. 抽象类没有对象,即一个抽象类不能用new来直接实例化. 不能定义抽象构造方法或抽象静态方法.(但是可以创建父类引用 ...
- 我是如何理解Java抽象类和接口的
在面试中我们经常被问到:Java中抽象类和接口的区别是什么? 然后,我们就大说一通抽象类可以有方法,接口不能有实际的方法啦:一个类只能继承一个抽象类,却可以继承多个接口啦,balabala一大堆,就好 ...
- JAVA抽象类和接口的深入探讨
Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...
- java基础之抽象类与接口的区别
在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...
- php抽象类和接口的区别
php抽象类和接口的区别 tags:抽象类 接口 抽象类和接口 php 引言:这是一个面试经常被问到的问题,也是一个经典问题.我们尽量引用官方权威的说明或者经过实验来证明本文所说的内容准确性. 抽象类 ...
- java详解final、多态、抽象类、接口原理
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...
随机推荐
- Vue2.0 - 构造器的延伸 Vue.extend
Vue.extend 返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器.经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元 ...
- iOS-字体UIFont的lineHeight与pointSize
首先我们来看一看UIFont的API里面有哪些属性: // Font attributes @property(nonatomic,readonly,strong) NSString *familyN ...
- cmp 指令
(lldb) disassemble -n comp2 untitled6`comp2: 0x10d065f40 <+>: pushq %rbp 0x10d065f41 <+> ...
- luogu 2463 [SDOI2008]Sandy的卡片 kmp || 后缀数组 n个串的最长公共子串
题目链接 Description 给出\(n\)个序列.找出这\(n\)个序列的最长相同子串. 在这里,相同定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串. 思路 参考:hzwe ...
- FTK应用程序编程接口(API)手册-1【转】
转自:http://blog.csdn.net/absurd/article/details/6702047 框架函数 框架函数支撑FTK的主体,它负责初始化应用程序,启动主循环和退出主循环.它对任何 ...
- 关于apache 虚拟主机配置访问403的问题
<Directory /> Options FollowSymLinks Order allow,deny Allow from all</Directory&g ...
- Jquery操作层级选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- AC日记——3的幂的和 51nod 1013
3的幂的和 思路: 矩阵快速幂: sn-1 3 1 sn * = 1 0 1 1 来,上代码: #include <cstdio> ...
- ASP.NET MVC验证所有属性是否合法
1.实现代码: /// <summary> /// 验证所有属性是否合法 /// </summary> /// <param name="modelState& ...
- react 使用antd的多选功能做一个单选与全选效果
一个小而简单的单选全选功能,其实官网已经给出效果了,不过是我多做了些复合用法 addorupdatemodal.jsx import React from "react"; imp ...