虚方法【只有虚方法或者抽象方法才能被子类方法重写】

来源:互联网 发布:mysql update join on 编辑:程序博客网 时间:2024/04/27 20:28

<1>

当子类重写了父类的同名虚方法后,当我们让父类变量执行这个子类对象的时候,通过这个父类变量调用这个虚方法,调用的仍然是父类的。只不过父类的虚方法被子类覆盖带哦了。所以实际上调用的是子类的

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{    public class person    {        public virtual void Sing()        {            Console.Write("我是父类方法!");        }    }    public class Student:person    {        public override void Sing()        {            Console.Write("我是子类方法,我覆盖了父类同名方法!");        }       }    class Program    {        static void Main(string[] args)        {            person p1 = new person();            p1.Sing(); //输出:我是父类方法!            Student s1 = new Student();            s1.Sing();//输出:我是子类方法,我覆盖了父类同名方法!            //当子类重写了父类的同名虚方法后,当我们让父类变量执行这个子类对象的时候,通过这个父类变量调用这个虚方法,调用的仍然是父类的。只不过父类的虚方法被子类覆盖带哦了。所以实际上调用的是子类的            person p2 = new Student();            p2.Sing();//输出:我是子类方法,我覆盖了父类同名方法!                     Console.ReadKey();        }    }}



using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Test{    //从设计角度考量,通常将子类中共有的但却容易变化的特征抽取为虚函数在父类中定义,而在子类中通过覆写来重新实现其操作。    class A    {        public virtual void MyMthod() //虚方法可以有方法体,而抽象方法不可以有。        {            Console.WriteLine("我是一个虚方法");        }    }    class B : A    {        public override void MyMthod() //重写父类中的虚方法        {            Console.WriteLine("我重写了父类的虚方法");        }    }    class C : A  //C类继承了A类。它可以override重写父类中的虚方法也可以不重写    {        public void Sum(int a, int b)         {            Console.WriteLine(a + b);        }    }    class InheritanceTest1    {        static void Main(string[] args)        {            B b = new B();            b.MyMthod(); //输出:我重写在父类的虚方法            A a = new A();            a = b; //将变量a指向变量b指向的对象            a.MyMthod(); //所以这里同样调用的也是B类里的MyMthod()方法。所以输出:我重写在父类的虚方法            C c = new C();            c.MyMthod(); //因为C类没有重写父类的虚方法。所以这里调用的是父类的MyMthod()方法,所以这里输出:我是一个虚方法            Console.ReadKey();        }    }}


<2>虚方法实例

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Test{    //从设计角度考量,通常将子类中共有的但却容易变化的特征抽取为虚函数在父类中定义,而在子类中通过覆写来重新实现其操作。    class Person    {        public virtual void SayHello() //虚方法可以有方法体,而抽象方法不可以有。        {            Console.WriteLine("我是一个人,我会说话");        }    }    class Boy : Person    {        public void Features()        {            Console.WriteLine("我有JJ");        }    }    class Girl : Person  //Girl类继承了Person类。它可以override重写父类中的虚方法也可以不重写    {        public void Features()        {            Console.WriteLine("我有胸部");        }    }    class 残疾人 : Person    {        public override void SayHello()  //因为这里子类有特殊需求。所以这里重写了父类的虚方法。        {            Console.WriteLine("我嗓子哑了,不会说话了");        }    }    class InheritanceTest1    {        static void Main(string[] args)        {            Boy boy = new Boy ();            boy.SayHello();  //因为我是人,所以我有人共有的说话的能力            boy.Features();  //因为我是男的,我的特征是长了JJ            Girl girl = new Girl();            girl.SayHello(); //因为我是人,所以我有人共有的说话的能力            girl.Features(); //因为是我女的,我的特征是长了胸部            残疾人 c = new 残疾人();            c.SayHello(); //因为我现在嗓子哑了,所以我不能说话了。            Console.ReadKey();        }    }}



0 0
原创粉丝点击