父类句柄指向派生类实例时,句柄的成员指向父类还是子类
using System;
class A
{
public int n =1;
public void showinfo()
{
System.Console.Write("some information aaa");
}
public virtual void showage()
{
System.Console.Write("13");
}
}
class B:A
{
//public int n =1;
public new void showinfo()
{
System.Console.Write("some information bbb");
}
public override void showage()
{
System.Console.Write("15");
}
public void getname()
{
System.Console.Write("name");
}
}
class Program
{
public static void Main()
{
A a1 = new B();//这里是实例化A,根据没有实例化B
a1.showinfo
();//请问是执行的父类showinfo()还是派生的showinfo();为什么?我用new隐藏了父类同名方法,为什么测试得到这里还是执行的父类方法。 a1.showage();
a1.getname();
}
}
------解决方案--------------------父类引用指向派生类实例时
除了virtual成员 通过父类引用 只能获取父类的成员
new的作用是为了隐藏父类的同名方法
隐藏不代表“去除”
class A
{
public void AA()
{
}
}
class B:A
{
public new void AA()
{
}
}
A a = new B();
a.AA(); //父类的
B b = new B();
b.AA(); //派生类的
------解决方案--------------------在很久很久以前,我使用c和汇编语言来开发国产的大型程控交换机的话务台系统,那时候还刚刚又“面向对象技术”这种东西(国外也刚刚开始出现其成熟的理论,例如OMT),我们自己使用不支持OOPL的编程语言来来“委派地”模拟OOPL技术,就是这样“子类对象内部有一个指针去指向父类对象”的。因为我们做不了编译器,只能用比较低级的手段模拟人家OO编程。
但是这中模拟是有害的,因为你的脑子里毕竟有着一大堆结构化、冗余的东西干扰你的设计到代码的实现。如果你使用一种OOPL语言,就不要再去以为“子类对象内部有一个父类对象”这种东西,子类对象“就是”一个父类对象,而不是委派。
------解决方案--------------------因为你根本没有任何OO设计的经验,所以体会不了函数重写和隐藏的使用场景,这才有这样的疑问。
即便你记住了什么一些“规则”,又有什么用呢。对你来说,这只是一个纸上谈兵的魔术而已。
既然你提问,何必掩饰自己的问题所在。不懂装懂反倒让人觉得可笑。