using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace IL_Method_Test { public class Father { public void DoWork() { Console.WriteLine("Father.DoWork()"); } } public class Son :Father { public new void DoWork() { Console.WriteLine("Son.DoWork()"); } } class Program { static void Main(string[] args) { Father son=new Son(); son.DoWork(); Son newSon = new Son(); newSon.DoWork(); Console.Read(); } } } 第一个son.DoWork();为什么会调用父类的方法 |
|
10分 |
有两个毫无关系都叫DoWork的方法,
用基类类型访问,访问的是基类的,用子类类型访问,访问的是子类的(子类隐藏了基类的方法)。 根本不是“覆盖”。 |
10分 |
你记住一点,如果父类定义了一个方法,并且没有用virtual修饰它,那么无论如何你用父类类型调用它,都没有办法调用成子类定义的那个方法。
public class Father { public void DoWork() //不加virtual { Console.WriteLine(“Father.DoWork()”); } } public class Son :Father { public new void DoWork() { Console.WriteLine(“Son.DoWork()”); } } 你永远不可能试图实现 Father f = new Son(); f.DoWork(); //调用除Father.DoWork以外的另一个方法。 |
new是隐藏,override才是覆盖,你把子类中的new改成override,就会调用子类的方法了。
另外你的Son newSon = new Son(); newSon.DoWork(); 这个根本不是覆盖,就是直接调用的son的dowork |
|
首先谢谢caozhy您的回答
Father son=new Son(); 构建了一个Son类的对象却赋值给了Father类的变量,是不是这个变量相当于简洁的变成了下面这个样: Father son=new Father(); 但又不完全是这个意思? |
|
子类隐藏了父类的方法,是不是表示这个子类有两个一样的方法,只是有个不能调用?
|
|
你没有明白什么叫继承
Father son=new Son(); 注意这个理解的差异,比如 如果你按照我说的就很好理解了,定义了一个实现了IDispose接口的任意类型的变量。 |
|
什么叫隐藏?
Son son = new Son(); son.DoWork()按理说因为Son继承了Father,那么应该调用Father.DoWork(),但是因为你又定义了一个重名的变量叫DoWork()所以它“隐藏了”那个DoWork()。 我们用变量名的隐藏类比下: 显然是123而不是456,为什么,因为foo1()中定义了一个也叫i的变量(和局部变量i毫无关系),并且修改的是那个i,那个i就隐藏了作为局部变量的i。 一个道理,如果你写 |
|
caozhy
您看看我的想法是不是正确(刚学C#)我自己想的: |
|
所以你可以看到,new去隐藏基类方法,是一种很变态很无聊的用法,最可笑的是,一些傻X老师会非要让初学者去学习它,其实你一辈子不用它,也不知道它最好。
|
|
一个变量代表一个值
一个函数代表一个功能 这是小学生都能想明白的事情 为什么明明不同的两个功能,非要起一个名字?我觉得你能想明白这个问题比去理解方法隐藏怎么用更有意义。 |
|
我知道您说的意思了,刚才没说完,就发帖了,您看看我下面说的
我如果定义了一个Son的新方法: public void DoWork1() { Console.WriteLine("Son.DoWork1()"); } Father son=new Son(); |
|
我现在懂了,非常感谢您
|
|
那这样说的话,son调用的应该是子类的方法啊 |
|
那等于我白说了。你的逻辑真强大。 |