类的多态实现(虚方法)咨询
class Program
{
static void Main(string[] args)
{
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
Console.ReadKey();
}
}
class A
{
public void F()
{
Console.WriteLine("A的F");
}
public virtual void G()
{
Console.WriteLine("A的G");
}
}
class B : A
{
new public void F()
{
Console.WriteLine("B的F");
}
public override void G()
{
Console.WriteLine("B的G");
}
}
这段代码中A a=b是将b变量的地址给a吗?如果是的话a.F()应该输出"B的F",但是输出的是"A的F",这个地方我有些不懂了,哪位高手能给解释一下这个 A a=b是啥意思? --------------------编程问答-------------------- 一个是 new public void F() ,一个是 public override void G()
new 的意思是在当前类型中掩盖掉父类同名同参的方法,相当于套牌或冒名顶替,对父类没有影响,但是当类型转为父类时,就调用的是父类原本的方法了,而 override 是直接将父类中的方法替换成自己的,所以即使类型转换为父类,内容依然是自己的,当然要求也更高,要求父类方法带有 virtual 修饰。 --------------------编程问答-------------------- A a=b 是不是直接将b的引用地址直接赋给了a呢?就是a指向了b,那a.F()就应该等同于b.F(),那应该是调用 Console.WriteLine("B的F");这个呀?我还是没弄明白!转不过这个弯! --------------------编程问答--------------------
A a=b 是将 b 的地址给了 a,执行时是不会也不可能去管那个数据的实际类型的,代码指定什么就是什么,如果是虚方法,会有个虚方法表,指定类型对应该调用的方法,调用方法时,如果是虚方法,就去查虚方法表找到代码指定类型对应的方法,如果不是虚的,就直接调用,当转成 A 后,F 不是虚方法,就直接执行 A 自己的 F 了。 --------------------编程问答-------------------- 你就记住new这种写法和继承、多态没有关系,虽然能编译,但是可能你一年到头也用不到,就无视它好了。
只要记住virtual/override一种就行了。 --------------------编程问答-------------------- new public void F()这种是子类把父类的方法用一个同名的函数给隐藏了。因此调用的不是同一个方法 --------------------编程问答-------------------- 似懂非懂 --------------------编程问答-------------------- 你要理解多态走的过程
1,实例化,构造函数,就不说了
执行a.F();
先到A下面看 是否有F()
有就直接执行--
如果是虚方法,就去B看看是否有覆盖方法,有就执行B的F()
如果B没有覆盖,则返回执行A的F();
你要理解这个过程,包括A a=new B(); 构造函数是怎么走的,静态构造函数怎么走的……
认真理解C#语法
补充:.NET技术 , C#