一 abstract:
abstract修饰类,表示抽象类
抽象类有以下特征:
不能实例化
抽象类可以包含抽象的方法、属性、索引器及事件。但是抽象类也可以包含非抽象成员。
派生自抽象类的类必须实现抽象类的所有抽象成员。
abstract修饰方法、属性、索引器及事件(这里我们以抽象方法来讲解,抽象属性、索引器及事件类似)。
抽象方法具有以下特征:
抽象方法是隐式的虚方法,但它与虚方法不同,虚方法在派生类既可以用override进行重写,也可以不重写。但是抽象方法在派生类中是必须用override来进行重写的。
只允许在抽象类中使用抽象方法声明。
二 interface:
interface可以定义“接口类型变量”,就好像类可以定义类类型的变量(或者说是引用类型变量)。申明一个类类型的变量,然后我们通常使用构造器创建对象,并把该对象赋值给类类型的变量(或者说引用变量引用到我们创建的对象)。这样,我们就可以通过类类型的变量来操作我们实际new出来的对象。于此类似的,我们也可以创建接口类型的变量(或者说是接口类型的引用变量),并把一个实现了该接口的实现类的对象赋值给接口类型的引用变量(或者说接口类型的引用变量引用到该接口实现类的对象)。通过接口类型的变量,我们便可以调用实现了该接口的类的对象。从这看出,类和接口有相似的地方。它们都有多态的存在法声明。
三 接口和抽象类的区别:
1.接口用于规范,抽象类用于共性。
抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
2.接口中只能声明方法,属性,事件,索引器。
而抽象类中可以有方法的实现,也可以定义非静态的类变量。
抽象类可以提供某些方法的部分实现,接口不可以。抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。
3.在抽象类中加入一个方法,那么它的子类就同时有了这个方法。
而在接口中加入新的方法,那么实现它的类就要重新编译(这就是为什么说接口是一个类的规范了)。
4.接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。
5.此外接口不能保护字段、构造函数、析构函数、静态成员或常量。
四:应用场景实例:
我们定义一个水果类和蔬菜类,其中水果类包含各种的水果,蔬菜类包含各种蔬菜。
问题:按照常理,卖水果的直接引用水果类,卖蔬菜的引用蔬菜类。当有家超市既卖水果又卖蔬菜。这时我们就需要用到接口来实现。
以下列出接口和抽象类代码例子:
1.抽象类:基类只能继承一个父类 (卖水果的只能卖水果,卖蔬菜的只能卖蔬菜。)
public abstract class IFruits
{
public abstract string apple();
}
public abstract class IVegetables
{
public abstract string potato();
}
public class Fruits : IFruits
{
public override string apple()
{
throw new NotImplementedException();
}
}
public class Vegetables : IVegetables
{
public override string potato()
{
throw new NotImplementedException();
}
}
2.接口:类可以引用多个接口(一个商店可以同时可以卖蔬菜和水果。)
public interface IFruits
{
string apple();
}
public interface IVegetables
{
string potato();
}
public class Shop : IFruits, IVegetables
{
public string apple()
{
throw new NotImplementedException();
}
public string potato()
{
throw new NotImplementedException();
}
}