加载中…
个人资料
雨夹雪
雨夹雪
  • 博客等级:
  • 博客积分:0
  • 博客访问:3,055
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
谁看过这篇博文
加载中…
正文 字体大小:

c#多态性改进--new,override

(2008-01-04 13:48:31)
标签:

杂谈

分类: 看闲书
 

  昨夜想了一晚上都没能弄明白override和new对于继承的多态性的贡献有什么区别。今天一早就起来了,测试了一番之后发现,他们之所以不同,主要不在于实现上,而是在于思想和编程习惯上的。

  除了去掉多重继承并加入了VB思想中的接口继承之外,C#对C++/CLI C++/JAVA的改进显著的体现在了安全上。对于一个虚函数的重写,必须给出关键字override,否则将会产生一个编译警告。如果将所有警告都看成错误的话,这将给用户带来安全上的警示。比如如下的代码:

using System;

namespace Lionx.Testcases{
    public class MyClass1{
        public void printout()
        {
            Console.WriteLine("I'm in class 1!");
        }
    };
    public class MyClass2 : MyClass1{
        public void printout()
        {
            base.printout();
            Console.WriteLine("I'm in class 2!");
        }
    };
    public static class MyProg1{
        static void Main()
        {
            Console.WriteLine("Hi! Let's have a test.");
            MyClass1 myClass1 = new MyClass1();
            MyClass2 myClass2 = new MyClass2();
            myClass1.printout();
            myClass2.printout();
        }
    };
}

编译上面的代码,将会产生编译警告:"Lionx.Testcases.MyClass2.printout()"隐藏了继承的成员"Lionx.Testcasese.MyClass1.printout()"。如果是有意隐藏,请使用关键字new。这一点很好理解,因为继承类中不能有和被继承类中相同的方法签名。这对于C++几乎是个错误。但现在C#允许这样做(在加了new后),更多是为了版本考虑。使用 new 关键字时,调用的是新的类成员而不是已被替换的基类成员。这些基类成员称为隐藏成员。如果将派生类的实例强制转换为基类的实例,就仍然可以调用隐藏类成员。

  将MyClass2中的printout签名改为public new void printout()即可编译成功,结果是:

Hi! Let's have a test.

I'm in class 1!

I'm in class 1!

I'm in class 2!

  如果MyClass1中声明printout是virtual的,则如果在MyClass2中的printout签名中没有出现override关键字,仍然会出现编译警告。这是为了避免继承类中重写虚拟函数时函数名写错。比如如果MyClass2中误写为public override void Printout(),则在编译时会产生错误:"Lionx.Testcases.MyClass2.Printout()":没有找到适合的方法来重写。而在C++/JAVA中,这种简单的错误将导致不可预料的后果。

  虽然MSDN中说派生类中虚函数重写时,可以选择使用override关键字而不是new,将基类实现替换为它自己的实现,但是经过我测试,使用这两个关键字没有什么区别,使用new并不会产生编译问题,且运行结果也和override效果相同。但是如果在基类中没有声明virtual但在继承类中使用override重写,会导致编译错误:继承成员未被标记为virtual,abstract或override。看来,可以总结为:new可以替代override,反之不然。

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
前一篇:那些人
后一篇:想起刚搬家
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    < 前一篇那些人
    后一篇 >想起刚搬家
      

    新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有