总结:
1. 在继承上, new/override没区别
2. 在多态上,new不支持多态,override支持
在C#中改变类中相同名称的方法的实现过程中有三种方式:重载、重写和覆盖。
重载:指具有相同的方法名,通过改变参数的个数或者参数类型实现同名方法的不同实现。
重写:则是只在继承中,子类通过override关键字修饰方法,实现父类和子类相同方法的不同实现,注意,父类方法必须是用virtual或者abstract关键字修饰的虚方法或者抽象方法
覆盖:则是指在继承中,子类通过在与父类相同方法名之前用new修饰的一个新的方法的定义
1.new ---- 子类隐藏父类的方法,覆盖(总结:new关键字不支持多态)
下面的例子我们可以发现new 关键字,并不支持多态的应用
我们使用多态调用的任然还是父类中的方法,也就是被隐藏的方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { Father fa = new Son(); fa.print(); } } class Father { public void print() { Console.WriteLine("我是父类"); } } class Son : Father { public new void print() { Console.WriteLine("我是子类"); } }}
输出:
如果我们使用了多态创建了实例,要调用子类重写的方法,需要强制转换成子类类型,实例如下:
class Program { static void Main(string[] args) { Father fa = new Son(); Son so = (Son)fa; so.print(); } }
输出:
2.virtual-- 重写 abstract--实现 (总结:这两种都支持多态)
a.重写父类的方法要用到override关键字(具有override关键字修饰的方法是对父类中同名方法的新实现) b.要重写父类的方法,前提是父类中该要被重写的方法必须声明为virtual或者是abstract类型。(virtual修饰的可以有方法体,子类不一定要重写 abstract没有方法体,子类必须要实现) C.virtual关键字用于将方法定义为支持多态,有virtual关键字修饰的方法称为“虚拟方法” 实例如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { Father fa = new Son(); fa.print(); } } class Father { public virtual void print() { Console.WriteLine("我是父类"); } } class Son : Father { public override void print() { Console.WriteLine("我是子类"); } }}
输出: