黑马程序员技术交流社区
标题:
强制转换为父类 为什么还是子类的方法?
[打印本页]
作者:
马林康
时间:
2012-7-23 20:31
标题:
强制转换为父类 为什么还是子类的方法?
namespace 方法重写
{
class Program
{
static void Main(string[] args)
{
Parent p1 = new Parent();
Parent p2 = new Child();
p1.show();
p2.show();
((Parent)p2).show();//子类方法
强制转换为父类 为什么还是子类的方法?
Console.ReadKey();
}
}
class Parent
{
public virtual void show()
{
Console.WriteLine("父类方法");
}
}
class Child:Parent
{
public override void show()
{
Console.WriteLine("子类方法");
}
}
}
作者:
刘建素
时间:
2012-7-23 21:36
楼主举例实际是实现了多态, Parent p2 = new Child(); 这样写的话是new了一个子类的对象 在p2对象前加了(Parent)相当于用父类引用子类 而你new的是子类 所以调用的还是 子类重写方法 。输出("子类方法")
作者:
刘玉
时间:
2012-7-24 08:33
简单一句话就是“谁创建的对象,调用谁的方法”
作者:
曾玉锋
时间:
2012-7-24 08:47
举一个很容易理解的例子:
女人继承于人,楼主是女人的一个实例对象。
那我们说,楼主是不是人?难道楼主就不是女人了?这是肯定的哈! 所以从子类实例转换为父类类型,对象本身并没有改变。
作者:
黑马李果
时间:
2012-7-26 10:21
其实在Parent p2 = new Child();时就已经将这个创建的Child对象隐式转换为父类Parent了。
在这里,你用的是override, 在一条继承链上,将一个对象转换为其所属类型以下的基类,调用被override的方法,是调用override得最远的版本。
如一个子类C转换为父类P1的父类P2,对P2的某个方法,如果P1用的new来重写,那么就只能调用P2的该方法,如果P1用的override,子类C没有重写,那么就调用P1的实现,如果C中也用override重写了,就调用C中的实现。但是如果C还有子类C1,C1中也用override重写了该方法,还是只能调用C中的实现,因为这个对象本质上是C类型的而不是C1类型,除非它之前就是C1转换来的。
作者:
吴立杰
时间:
2012-7-26 13:54
Parent p1 = new Parent();
Parent p2 = new Child();//你这里已经多态了,还用下面强转吗?
p1.show();
p2.show();
((Parent)p2).show();//多态,父类引用指向子类对象的时候,调用成员同名方法时,调用的是子类的。如果是成员变量调用的是父类的。
Console.ReadKey();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2