C#类的多态性

1.编译时的多态性:通过方法重载实现

一个类的对象调用若干同名方法,系统在编译时,根据调用方法的实参类型及实参的个数决定调用那个同名方法,实现何种操作。

2.运行时的多态性:通过虚方法实现(在方法声明前加上virtual修饰符为虚方法)

在系统运行时,不同对象调用一个名字相同,参数的类型及个数完全相同的方法,会完成不同的操作。

using System;
class A{ 
    public void F(){ //非虚方法
        Console.Write("   A.F");
    }
    public virtual void G(){ //虚方法
        Console.Write("   A.G");
    }
    static void F2(A aA){
        aA.G();
    }
}

class B:A
{ 
    new public void F(){ //覆盖基类的同名非虚方法F(),注意使用new
        Console.Write("   B.F");
    }
    public override void G(){ //覆盖基类的同名虚方法G(),注意使用override
        Console.Write("   B.G");
    }
}

class Test{
    static void Main(){
        B b=new B();
        A a1=new A();
        A a2=b;  //允许基类引用变量引用派生类对象,重点:a2引用派生类B对象b!!!
        a1.F(); //A.F
        a2.F();  //非虚方法,A.F
        b.F();  //B.F
        a1.G();  //G()为虚方法,因a1引用基类A对象,调用基类A的G(),A.G
        a2.G();  //G()为虚方法,因a2a2引用派生类B对象,调用派生类的G(),B.G
        F2(b);  //由于A aA=b,  B.G
        F2(a1);  //A.G;
}

应用:如在Person类中,公有方法Display()来显示个人信息,在派生类中Employee中,覆盖了基类的公有方法Display(),以显示新增信息。若希望隐藏这些细节,无论基类还是派生类,都调用一个显示方法,根据对象的不同,自动显示不同的信息,就可以用虚方法实现。

发布了138 篇原创文章 · 获赞 22 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/guihaiyuan123/article/details/83040295