[转]c#中new、virtual、override用法

子类函数覆盖父类函数的方法总结:

    (1)不使用任何修饰符

    在不使用任何修饰符的情况下,可以实现覆盖,但是会有警告。

    (2)使用new

    new用在子类重写父类的函数前,此时覆盖可以正常完成,但是具体调用父类的函数还是调用子类的函数,要看对象的类型。示例程序如下:

namespace demo
{
    class Person

    {

        private string name;
        private int age;

        public string Name
        {
            set
            {
                name = value;
            }
            get
            {
                return name;
            }
        }

        public int Age
        {
            set
            {
                age = value;
            }
            get
            {
                return age;
            }
        }

        public void show()
        {
            Console.WriteLine("姓名:{0},年龄:{1}", name, age);
        }        static void Main(string[] args)
        {

            Person per = new Person("张三丰", 24);
            per.show();
            //Person stu = new Student();//此时调用父类中的show方法

            //Student stu = new Student();//此时调用子类中的show方法
            stu.Department = "计算机";
            stu.show();
        }
    }

    class Student:Person
    {
        string department;
        public string Department
        {
            set
            {
                department = value;
            }
            get
            {
                return department;
            }
        }
        public new void show()
        {
            Console.WriteLine("系别:" + department);
        }

    }
}

    (3)使用virtual,new或override

    virtual用在父类的要被重写的函数前,new或override用在子类的重写父类的函数前。示例程序如下:

namespace demo
{
    class Person

    {

        private string name;
        private int age;

        public string Name
        {
            set
            {
                name = value;
            }
            get
            {
                return name;
            }
        }

        public int Age
        {
            set
            {
                age = value;
            }
            get
            {
                return age;
            }
        }

        public virtual void show()
        {
            Console.WriteLine("姓名:{0},年龄:{1}", name, age);
        }        static void Main(string[] args)
        {

            Person per = new Person("张三丰", 24);
            per.show();
            //Person stu = new Student();//此时调用子类中的show方法

            //Student stu = new Student();//此时调用子类中的show方法
            stu.Department = "计算机";
            stu.show();
        }
    }

    class Student:Person
    {
        string department;
        public string Department
        {
            set
            {
                department = value;
            }
            get
            {
                return department;
            }
        }
        public new void show() //new也可以是用virtual。new时,调用父类show();override时,调用子类show()
        {
            Console.WriteLine("系别:" + department);
        }

    }   

     (4)总结如下

    virtual函数允许子类函数重写该函数,override无论子类的实例是父类类型还是子类类型,子类的实例都会调用子类中重写的函数。new子类实例是子类类型,则调用子类中的重写函数;子类实例是父类类型,则调用父类中的重写函数。

    父类中没有virtual修饰的函数也可以被子类中的new函数重写,但是此时子类的实例若是父类类型,调用的函数是父类的函数。

posted @ 2013-06-24 11:01  阑珊一舞  阅读(118)  评论(0编辑  收藏  举报