多态,你烦不烦?--C#

      多态,我们都在用啊!可是,你会不会觉得它烦?让我回答,考试的话,它就烦了!

     

代码

namespace Try
{
    class Base
    {
        internal int x = 2;
        internal virtual int get()
        {
            return x;
        }
    }

    class SubClass : Base
    {
        internal int x = 3;
        internal override int get()
        {
            return x;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Base a = new SubClass();
            Console.WriteLine(a.x);
            Console.WriteLine(a.get());
        }
    }
}

上面的输出是什么?我运行了1000遍了,屏幕上写着:2 3。

其实看一看不是个什么问题啊。可是在VS.net 2005中有一个很奇怪的提示:

 

 

 

 

既然SubClass里的x hides了Base里的x,那么为什么打印出来的却都是Base里的x呢?

main函数中的a变量是Base行的,它引用的是Base类型,只不过是用SubClass的构造函数构造的而已,所以,

打印出来的是Base中的x也就不足为奇了。大家可以自己试试:

代码1

namespace ChexEx01
{
    class Base
    {
        internal int x = 2;

        public Base()
        {
            x = 5;
        }
        internal virtual int get()
        {
            return x;
        }
    }

    class SubClass : Base
    {
        //internal int x = 3;

        public SubClass()
        {
            x = 6;
        }
        internal override int get()
        {
            return x;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Base a = new SubClass();
            Console.WriteLine(a.x);
            Console.WriteLine(a.get());
        }
    }
}

这次打印出来的就是6  6了,很明显SubClass构造函数构造了变量a。最后,你再把SubClass中被注释掉的那行

代码的注释去掉,再看看运行结果。

 

 如果有兴趣的话,可以去看看Java中同样的代码的运行:

http://tb.blog.csdn.net/TrackBack.aspx?PostId=1334517

这里发现C#比Java更明确的一个地方,就是virtual和override的使用,让人多少会注意到这个地方的细节,而Java完全是靠动态绑定机制来做的,让人糊涂啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值