就是子类在创建对象时,会拷贝父类的字段和方法,如果子类重写父类方法的话,在内存中子类的重写方法会覆盖从父类拷贝的方法,如果子类定义一个同名的方法,在内存中按理说是存在父类拷贝的方法的后面,编译顺序也会在后面,但是调用的时候为什么会调用子类定义的同名方法呢,不是应该优先调用从父类拷贝的方法吗?代码如下:
public class Bird
{
private string type = "bird";
public virtual string ShowType()
{
return "bird";
}
}
public class Chicken : Bird
{
private string type = "chicken";
public new string ShowType()
{
return "chicken";
}
}
调用如下:
Bird bird = new Chicken();
Chicken chicken = new Chicken();
string str1 = bird.ShowType();
string str2 = chicken.ShowType();
为什么str1返回的是bird,这个明白。但是str2返回的为什么是chicken呢?
在 C# 中,派生类中方法的名称可与基类中方法的名称相同。可通过使用 new 和 override 关键字指定方法互动的方式。 override 修饰符 extends 基类方法,且 new 修饰符将其“隐藏”起来。
谢了,大体明白了。主要是因为父类型和子类型的引用在子类中访问区域或者说访问限制有关的~
子类使用public new string ShowType()
这个new就是覆盖父类的意思
代码的大部分语法都有点就近原则的味道
你都virtual了为什么不override?你override不就没这个事了么?
不应该按照在内存中先后顺序理解,首先重写的意义你要知道:子类继承父类的方法可以直接使用,可以在原有基础上修改原来的方法以满足自己的需要。所以一般状况下重写是不会用的,子类满足自己异于父类需要的时候才会用,反过来想,如果按照内存先后顺序的理念,那么重写又有什么意义?
重写是为了多个子对象实现不同的行为啊,而且重写会覆盖掉子类从父类继承的方法的
@Basker: 大兄弟,我说的是重写的概念,你说的是概念的延伸,你在纠结什么,重写是覆盖掉父类中子类从父类继承的方法不是覆盖掉子类中子类从父类继承的方法,应该是chicken啊,就算你不继承父类,也是chicken啊
都是Chicken 实例,new 是新建一个方法,所以方法表 里有两个ShowType。
虽然名字都叫ShowType,但是方法标识的申明类型是不同的,分别为 Bird.ShowType和 Chicken.ShowType。
直接看类型也知道是调用哪个,第一个str1是Bird,第二个str2是 Chicken 。
买本visual C# 高级程序设计.读完就不会有这种级别的问题了.
初学者/入门的人.强烈推荐买2本教材.就是大学里学这门语言时用的教材.看完再学别的.
不然就会变成 "非科班出身基础太差"