override帽子怎么样_override_boot override

电脑杂谈  发布时间:2017-02-06 19:10:19  来源:网络整理

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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...