分享

B继承A A a=new B();B a=new B()区别

 橙zc 2014-08-16

B继承A A a=new B();B a=new B()区别

public abstract class A

    {

        public A()

        {Console.WriteLine('A');}

        public virtual void Fun()

        {Console.WriteLine("A.Fun()");}

     }

    public class B : A

    {

        public B()

        {Console.WriteLine('B');}

     public new void Fun()

        {Console.WriteLine("B.Fun()");}

     public static void Main()

        {

          A a = new B();

          a.Fun();

            }

 }

他的输出时 A  B  A.Fun()

A a=new B();

这里a编译时类型是A,运行类型是B". 所以构造函数的调用就清晰明了吧

然而还是有点奇怪,如果a运行时类型是B的话,那么在调用方法F()时,为什么不调用B的方法F()(而是调用  A 的方法F())呢?

这是因为父类引用指向子类的对象(实例)

这时候 会调用子类重写的方法  但是不能调用子类自己的方法(父类没有的)

再有就是override与new得区别

如过程序里面的new换成override输出时是什么样子呢?

将会是 A B B.Fun();这是为什么呢

override的“覆盖”也就是次数重写是指子类覆盖了父类思路方法子类对象无法再访问父类中该思路方法

 new是指“隐藏”是指子类隐藏了父类思路方法当然通过定转换可以在子类对象中访问父类思路方法

 

1.B继承A,请问a是A的实例还是B的实例啊? 
答:B的实例  

2.对象a可以调用A类中的方法吗?可以调用B的方法吗? 
答:不一定,如果是虚拟方法,并且在B类重载了A的虚拟方法,a将会调用B的同名方法,普通方法会调用A的方法,

举例:
class A
{
public void MethodA(){...}
public virtual void MethodB(){...}
}

class B:A
{
public new void MethodA(){...}
public override void MethodB(){...}
}

其中,B类重写了A类的普通方法MethodA,也重写了A类的虚拟方法MethodB,则:
A a = new B();
a.MethodA();// 将会调用A类的MethodA方法
a.MethodB();// 将会调用B类的MethodB方法

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多