接口和抽象类

之前面试时被问及抽象类与接口的区别,感觉答得很不好,所以在此总结一下这个问题:

首先抽象类是一种特殊的类,它可以含有方法的定义和实现,也可以包含属性,构造函数等。当然抽象类也可以包含抽象函数和虚函数。 这个是C#三大特性之一多态的重要组成部分。

抽象类主要用于关系密切的对象之前,比如铁门和木门都是门,他们都继承自抽象类“门”。重点是“是什么?”

一个派生类只能继承至一个类(包括抽象类),派生类必须实现抽象类中定义的虚函数。

而接口是一种引用类型。它只能包含方法的定义但是没有实现。它更多的是起到一个规定的作用。

接口通常用于关系相对不那么紧密但是实现了某种功能的类之间。比如飞机和鸟都会飞,他们都继承自接口“飞”。重点是“能做什么?”

一个类可以继承自多个接口,而且必须实现接口中定义的所有成员(包括方法,属性等)。

好的接口应该是具有专一功能的,而不是多功能的,否则造成接口污染。如果一个类只是为了实现这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。

前面提到了抽象函数和虚函数,那么这两者之间有什么区别呢?

虚函数是由关键字 virtual 来声明的。它可以包含实现。派生类可以直接使用它的实现也可以覆盖(override)它的实现。

而抽象函数是由关键字abstract来声明的。它不能包含实现。派生类必须实现抽象函数。

原文地址:https://www.cnblogs.com/wuyuankun/p/3736833.html