抽象类和接口

Posted by 梁小生 on 2019-01-07

抽象类和接口、虚方法和抽象方法

抽象类

抽象类是类,用class声明。当一个类中有抽象的方法时,这个类也必须被声明为抽象的。抽象的方法或类都使用abstract修饰符来修饰。抽象类中可以有属性和非抽象的方法。抽象类不能被实例化,因为它有抽象的方法,无法调用。所以抽象类一般被设计用于继承。继承一个抽象类需要实现其所有的抽象方法,否则的话子类也应该被声明为抽象的。可以定义一个抽象类的引用来指向它的一个非抽象子类的对象。出处:https://www.jianshu.com/p/99cd192867bf

抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。

1
2
3
4
public abstract class ArEditViewModelBase : UfcViewModel
{

}

接口

接口比抽象类的抽象程度更高,它完全不包括实例方法或属性。接口使用关键字interface来声明。接口中只包含方法的声明,它就是用来描述类具有什么功能,而并给出每个功能的具体实现。接口中所有方法都自动地属于public,所以不用显示地声明。实现一个接口就要实现它所有的方法。

1
2
3
4
5
public interface IApp
{
// 获取MAC地址
string MacAddress { get; }
}

比较

  • 相同点

    接口和抽象类都不能被实例化;

    可以定义一个抽象类或接口类型的引用,用来引用子类或实现类;

  • 不同点

    继承抽象类时可以不实现其全部的抽象方法。当然这时子类也要被声明为抽象的。实现接口时所有的方法都要被实现;

    每个类最多继承一个抽象类,而可以实现多个接口;

    抽象类可以有main方法,并且我们可以运行它,接口不能有main方法;

    抽象类有构造方法,接口没有;

    使用抽象类时添加一个新的实例方法时,不需要修改子类;而为接口增加方法时,其所有实现类都要修改;

    在需要复用父类提供的一些基本代码,并且另外有部分代码需要子类实现时可以使用抽象类,它就像一个类的模板,如jdk中的aqs抽象类;如果要实现多继承那就必须使用接口;

    接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

抽象方法

1 抽象方法必须在抽象类中定义

2 抽象方法必须在派生类(子类)中实现

3 抽象方法没有提供实现部分

4 无法创建抽象类或接口的实例

1
2
//抽象方法(子类必须有这个方法实现,方法实现需要加上 override 关键字)
public abstract void Show();

虚方法

1 虚方法不必须在派生类(子类)中重写实现

2 虚方法声明方法实体

3 可以创建虚方法类的实例

4 如果抽象类中有虚方法,不必须在派生类(子类)中重写

在项目中的运用,比如模块或者一个界面是给其他人调用的模块,但是在其他的系统中可能要重写函数或者重写整个界面,那么是就可以设置为virtual类,要重写的函数前面加virtual关键字。

1
2
3
4
5
//虚方法(子类可以重写也可以不重写,方法实现需要加上 override 关键字)
public virtual void Say()
{
Console.WriteLine("虚方法");
}