Console.WriteLine('Father:{0} {1}', firstname, lastname); } } classSon : Father { public int age; public Son() : base() { } publicSon(string firstname, string lastname,intage):base(firstname,lastname) { this.age = age; } //public new voidGetFullName() public override void GetFullName() {Console.WriteLine('Son:{0} {1}', firstname, lastname); } } classProgram { static void Main(string[] args) { Father father = newFather('Alan', 'Liao'); Father son1 = new Son('Little Alan ','Liao',20); father.GetFullName(); son1.GetFullName();Console.ReadLine(); } }
本代码输出:
Father:Alan Liao
Son:Little Alan Liao
若将36行换成35行(即将Override换成New)
输出结果为:
(其实代码中的virtual,override 都可以去掉,可以编译,运行通过,但是会有Warnning,结果同下)
Father:Alan Liao
Father:Little Alan Liao
可见结果不一样。
Father a=new Son();
使用new声明的方法使用的仍是父类方法,而override声明的方法使用的是子类中的方法。
其实,根本原因是对象a会优先调用子类中的方法,如类没有重写父类的方法,a 就调用父类中的方法。
override 说明的是虚方法,在子类中覆盖父类中的方法。
new则不是,new是给子类新增加了一个函数,可以说除了函数名字相同以外,它跟基类里面的这个同名函数没有任何关系。override相当于重新新建了一个方法,从而隐藏了父类方法.
在 C# 中,派生类可以包含与基类方法同名的方法。
(1)基类方法必须定义为 virtual。
(2)如果派生类中的方法前面没有 new 或override关键字,则编译器将发出警告,
该方法将有如存在 new 关键字一样执行操作。
(3)如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。
(4)如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。override
(5)可以从派生类中使用 base 关键字调用基类方法。
(6) override、virtual 和 new 关键字还可以用于属性、索引器和事件中。
补充:
class Father { public virtual void PrintName() {Console.WriteLine('Father:{0}', this.GetType().ToString()); } }class Son : Father { //public new void PrintName() public overridevoid PrintName() { Console.WriteLine('Son:{0}',this.GetType().ToString()); } } class Program { static voidMain(string[] args) { Father father = new Father(); Father son =new Son(); father.PrintName(); son.PrintName(); Console.ReadLine();} } 以上程序的运行结果:(其中myNamespace是这两个类的命名空间)
Father:myNamespace.Father
Son:myNamespace.Son
如果在第11行将override换成new,那么运行结果如下:
Father:myNamespace.Father
Father:myNamespace.Son
从上可以看出虽然调用的是Father类中的方法,但是this.GetType()返回的是myNamespace.Son类型,所以在Father中的PrintName()方法中的this指的是调用该方法的对象,而不是定义该方法的对象。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-30933-1.html
撞沉它