抽象类和虚方法、base关键字

时间:2021-08-05 07:59:39

微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members

抽象类和类成员

通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。 例如:

public abstract class A
{
// Class members here.
}

抽象类不能实例化。 抽象类的用途是提供一个可供多个派生类共享的通用基类定义。 例如,类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该库的程序员通过创建派生类来提供自己的类实现。

抽象类也可以定义抽象方法。 方法是将关键字 abstract 添加到方法的返回类型的前面。 例如:


public abstract class Animal
{
    public abstract void Call();   //无方法体
    public virtual void Bak()   //有方法体
    {
        Console.WriteLine("jiaojiao");
    }
    public Animal(int id)
    {
        Console.WriteLine(id);
    } } public class Dog : Animal
{
    
    public override void Call()   //重写抽象方法
    {
        
    }
    public override void Bak() //重写虚方法
    {
        Console.WriteLine("goujiao");
        // base.Bak();
    }
    public Dog(int id) :base(id) //调用父类的Animal.Animal(id) 方法
    {     } }
 

虚方法

在 C# 中,派生类可以包含与基类方法同名的方法。

  • 基类方法必须定义为 virtual

  • 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将如同存在 new 关键字一样执行操作。

  • 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。

  • 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。

  • 可以从派生类中使用 base 关键字调用基类方法。

base关键字

base其实最大的使用地方在面向对象开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法。

                关于base
                    base 关键字用于从派生类中访问基类的成员:
                    调用基类上已被其他方法重写的方法。
                    指定创建派生类实例时应调用的基类构造函数。
                    基类访问只能在构造函数、实例方法或实例属性访问器中进行。