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

父类句柄指向派生类实例时,句柄的成员指向父类还是子类
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设计的经验,所以体会不了函数重写和隐藏的使用场景,这才有这样的疑问。

即便你记住了什么一些“规则”,又有什么用呢。对你来说,这只是一个纸上谈兵的魔术而已。

既然你提问,何必掩饰自己的问题所在。不懂装懂反倒让人觉得可笑。