C#动态多态性的理解

2019-11-16 来源: Goodluckty 发布在  https://www.cnblogs.com/tanyiblog/p/11872534.html

C#动态多态性是通过抽象类和虚方法实现的。

抽象类的理解

用关键字abstract创建抽象类,用于提供接口的部分类的实现(理解:接口不能提供实现,抽象类中可以有实现,接口与抽象类一起使用,可以达到父类中不能实现的子类就必须实现,父类中有实现的子类就不需要实现的目的)。抽象类包含抽象方法,抽象方法必须在派生类中实现,派生类具有更有更专业的功能。

有关抽象类的一些规则:

1、不能创建一个抽象类的实例。

2、不能在一个抽象类外包声明一个抽象方法。

3、通过在类定义前面放置关键字sealed,可以将类声明为密封类。当一个类被声明为sealed时,它不能被继承,抽象类不能被声明为sealed。

虚方法的理解

当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法,虚方法是使用关键字virtual声明的,虚方法可以在不同的继承类中有不同的实现,对虚方法的调用是在运行时发生的,动态多态性是通过抽象类和虚方法实现的。

抽象方法:

abstract方法和virtual方法的区别:

1、virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),abstract修饰的方法一定不能实现。

2、virtual可以被子类重写,而abstract必须被子类重写。

3、如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。

4、无法创建abstract类的实例,只能被子类继承,子类若不实现abstract类中的抽象方法,依然是个抽象类,不能被实例化;相反,若子类实现abstract类的抽象方法,则子类可以被实例化。

隐藏方法:隐藏方法使用new关键字定义。

虚方法和隐藏方法的区别:

虚方法的调用,调用上,使用子类构造的对象调用虚方法,就会调用子类的方法,使用父类构造的对象,就会用父类的方法。

隐藏方法的调用,调用上,使用子类类型的声明调用隐藏方法,就会调用子类的方法,若想调用被隐藏的方法,需要用父类类型的声明来调用。

调用不同举例:

class Enemy
{
    public void Move() {
        Console.WriteLine("调用了 enemy的move方法");
    }
    public virtual void Attack() {
        Console.WriteLine("enemy attac");
    }
    }

    class Boss : Enemy
    {
    public override void Attack() {
        Console.WriteLine("Boss Attac");
    }

    public new void Move() {
        Console.WriteLine("Boss move");
    }
}

static void Main(string[] args)
{
    //---- 隐藏方法的调用----begin
    Boss oneEnemy = new Boss();
    oneEnemy.Move(); // 调用的是隐藏方法, 用子类的声明来调用的,调用的就是子类的Move。

    Enemy twoEnemy = new Boss();
    twoEnemy.Move(); // 调用的隐藏方法, 用父类的声明来调用的,调用的就是父类的Move方法。
    //-----------------------end

    //-----虚方法的调用----- begin
    用什么类型 来构造,在调用方法的时候就会调用什么类型的方法。

    Enemy threeEnemy = new Enemy();
    threeEnemy.Attac(); // 调用虚方法,用父类来实例化的,所以调用的是父类的Attac方法。

    Enemy fourEnemy = new Boss();
    fourEnemy.Attac();  // 调用虚方法,用子类来实例化的,所以调用的就是子类(Boss)的Attac方法。

    //-----虚方法的调用------end

    Console.ReadKey();
}

相关文章