关于多态,我是初学者,请指点
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
用一个例子
鱼.移动{游}
鸟.移动{飞}
马.移动{跑}
蛇.移动{爬}
((动物)鱼).移动{}
((动物)鸟).移动{}
((动物)马).移动{}
((动物)蛇).移动{}
虽然都是 动物.移动
但它们都会表现出自己的形态~
也就是说 动物.移动 这个方法具有多态性