一. 面向对象重要特性之多态
要掌握C#的Override和New关键字的用法,首先要理解多态;这里不赘述各种官方对多态的解释,下面给出个人直白理解:
父类F中声明一个方法M并用virtual修饰其为虚方法,子类S实现了相同签名的方法M并用Override对齐进行修饰,这时称子类覆盖了父类的方法;用子类类型new出来赋值给父类类型的对象o时,o调用M,执行的是子类中的M,这种语法叫做多态。
二.Override和New使用示例
namespace LearnCS1
{class BaseClass{public virtual void Method1(){Console.WriteLine("Base - Method1");}public virtual void Method2(){Console.WriteLine("Base - Method2");}}class DerivedClass : BaseClass{public override void Method1(){Console.WriteLine("Derived - Method1");}public new void Method2(){Console.WriteLine("Derived - Method2");}}class Program{static void Main(string[] args){BaseClass bc = new BaseClass();DerivedClass dc = new DerivedClass();BaseClass bcdc = new DerivedClass();bc.Method1();bc.Method2();Console.WriteLine("------------------------------");dc.Method1();dc.Method2();Console.WriteLine("------------------------------");bcdc.Method1();bcdc.Method2();}}
}
/* Output:Base - Method1Base - Method2------------------------------Derived - Method1Derived - Method2------------------------------Derived - Method1Base - Method2
*/
上面示例代码中,bc对象调用的方法不存在继承和多态,则直接调用父类的方法;
dc对象调用的方法时属于继承语法(子类有则调用子类的,子类没有调用父类的),故调用子类方法
bcdc对象调用方法时属于多态语法,用override修饰的调用子类的,用new修饰的调用父类的
三.override修饰符
override方法提供从基类继承的方法的新实现。 通过 override
声明重写的方法称为重写基方法,也叫对父类方法的覆盖。 override
方法必须具有与重写基方法相同的签名。
不能重写非虚方法或静态方法。 重写基方法必须是 virtual
、abstract
或 override
。
不能使用 new
、static
或 virtual
修饰符修改 override
方法。
四.new修饰符
new和override这两个修饰符的含义互斥,用new修饰的成员称作隐藏,这也是编辑器默认的行为。如果移除new修饰符,程序仍可编译和运行,但会收到警告。
五.结论
override和new关键字是用来控制在继承关系中,对象访问子类还是父类成员的修饰符