C#方法修饰符 new和override的区别

关键字 方法修饰符 功能
new 方法的覆盖
override 方法的重写

在使用父类引用指向子类对象时可以看出区别,下面给出例子:

new

using System;

namespace Test {
    class Program {
        static void Main(string[] args) {
            Enemy e = new Boss();
            e.Move();
        }
    }

    class Enemy {
        public void Move() {
            System.Console.WriteLine("move");
        }
    }

    class Boss : Enemy {
        public new void Move() {
            System.Console.WriteLine("boss move");
        }
    }
}

输出

move

override

using System;

namespace Test {
    class Program {
        static void Main(string[] args) {
            Enemy e = new Boss();
            e.Move();
        }
    }

    class Enemy {
        public virtual void Move() {    // override继承的父类的方法成员需要标记为 virtual、abstract 或 override,这里使用virtual
            System.Console.WriteLine("move");
        }
    }

    class Boss : Enemy {
        public override void Move() {
            System.Console.WriteLine("boss move");
        }
    }
}

输出

boss move

可以看到:
new是覆盖了父类的方法,如果是父类的引用指向子类的对象,Move()方法调用的是父类的方法;
override是重写了方法,如果是父类的引用指向子类的对象,Move()方法调用的是子类的方法。