日期:2014-05-17  浏览次数:20804 次

关于多态,我是初学者,请指点
class MyClass1

  public virtual int Add(){}///A
}

class MyClass2:MyClass
{
   public override int Add(){}///B
}


///然后在main 函数中:

MyClass2 myclass2 = new MyClass2();

MyClass1 myclass1 = (MyClass1)myclass2;


问题:是不是myclass1.add() ,现在的方法是B了?
为什么?谢谢

------解决方案--------------------
只要是virtual/override永远执行的是重写的那个方法,也就是B


------解决方案--------------------
为什么说来话长,你不用管。而且这个原理就算你知道了,对于目前的你来说也没用。

只要明白一点,既然你辛辛苦苦写了子类和新的重写的方法,C#的语言设计者不会缺根筋地让它不起作用。

或者换一个角度说,OOP的三大法则第一条就是“封装”,所谓封装,就是一旦重写了一个方法,作为调用者,你无论如何也不能再接触到virtual的那个方法了。
------解决方案--------------------
MyClass2 myclass2 = new MyClass2();//真正存在和分配了内存,当然创建子之前会创建父
MyClass1 myclass1 = (MyClass1)myclass2; //这个只是改变类型而已,变量指向的还是myclass2

用一个例子
鱼.移动{游}
鸟.移动{飞}
马.移动{跑}
蛇.移动{爬}

((动物)鱼).移动{}
((动物)鸟).移动{}
((动物)马).移动{}
((动物)蛇).移动{}
虽然都是 动物.移动
但它们都会表现出自己的形态~
也就是说 动物.移动 这个方法具有多态性