星空网 > 软件开发 > ASP.net

编写高质量代码改善C#程序的157个建议——建议94:区别对待override和new

建议94:区别对待override和new

override和new使类型体系应为继承而呈现出多态性。多态要求子类具有与基类同名的方法,override和new的作用就是:

  • 如果子类中的方法前面带有new关键字,则该法被定义为独立于基类的方法。
  • 如果子类中的方法前面带有override关键字,则子类的对象将调用该方法。而不调用基类的方法。

我们来看一个继承体系:

    public class Shape    {      public virtual void MethodVirtual()      {        Console.WriteLine("base MethodVirtual call");      }      public void Method()      {        Console.WriteLine("base Method call");      }    }    class Circle : Shape    {      public override void MethodVirtual()      {        Console.WriteLine("circle override MethodVirtual");      }    }    class Rectangle : Shape    {    }    class Triangle : Shape    {      public new void MethodVirtual()      {        Console.WriteLine("triangle new MethodVirtual");      }      public new void Method()      {        Console.WriteLine("triangle new Method");      }    }    class Diamond : Shape    {      public void MethodVirtual()      {        Console.WriteLine("Diamond default MethodVirtual");      }      public void Method()      {        Console.WriteLine("Diamond default Method");      }    }

Shape是所有子类的基类。

Circle类override父类的MethodVirtual,所以即使子类转型为Shape,调用的还是子类方法:

      Shape s = new Circle();      s.MethodVirtual();      s.Method();

输出为:

circle override MethodVirtual
base Method call

      Circle s = new Circle();      s.MethodVirtual();      s.Method();

输出也为:

circle override MethodVirtual
base Method call

类型Rectangle没有对基类做任何处理,所以无论是否转型为Shape,调用的都是基类Shape的方法。
类型Triangle将基类Shape的virtual方法和非virtual方法都new了一般,所以第一种方法为:

      Shape s = new Triangle();      s.MethodVirtual();      s.Method();

因为子类应经new了父类的方法,故子类方法和基类方法完全没有关系了,只要s被转型为Shape,针对s调用搞得都是父类方法。

      Triangle triangle = new Triangle();      triangle.MethodVirtual();      triangle.Method();

调用的都是子类方法,输出为:

triangle new MethodVirtual
triangle new Method


类型Diamond包含了两个和基类一模一样的方法,并且没有额外的修饰符。这在编译器中会提出警示。但是如果选择忽略这些警示,程序还是一样可以运行。

      Shape s=new Diamond();      s.MethodVirtual();      s.Method();

编译器会默认new的效果,所以输出和显示设置为new时一样。

输出为:

base MethodVirtual call
base Method call

      Diamond s = new Diamond();      s.MethodVirtual();      s.Method();

输出为:

Diamond default MethodVirtual
Diamond default Method
最后给一个综合示例:

 static void Main(string[] args)    {      TestShape();      TestDerive();      TestDerive2();    }    private static void TestShape()    {      Console.WriteLine("TestShape\tStart");      List<Shape> shapes = new List<Shape>();      shapes.Add(new Circle());      shapes.Add(new Rectangle());      shapes.Add(new Triangle());      shapes.Add(new Diamond());      foreach (Shape s in shapes)      {        s.MethodVirtual();        s.Method();      }      Console.WriteLine("TestShape\tEnd\n");    }    private static void TestDerive()    {      Console.WriteLine("TestDerive\tStart");      Circle circle = new Circle();      Rectangle rectangle = new Rectangle();      Triangle triangel = new Triangle();      Diamond diamond = new Diamond();      circle.MethodVirtual();      circle.Method();      rectangle.MethodVirtual();      rectangle.Method();      triangel.MethodVirtual();      triangel.Method();      diamond.MethodVirtual();      diamond.Method();      Console.WriteLine("TestShape\tEnd\n");    }    private static void TestDerive2()    {      Console.WriteLine("TestDerive2\tStart");      Circle circle = new Circle();      PrintShape(circle);      Rectangle rectangle = new Rectangle();      PrintShape(rectangle);      Triangle triangel = new Triangle();      PrintShape(triangel);      Diamond diamond = new Diamond();      PrintShape(diamond);      Console.WriteLine("TestDerive2\tEnd\n");    }    static void PrintShape(Shape sharpe)    {      sharpe.MethodVirtual();      sharpe.Method();    }

输出为:

TestShape       Start
circle override MethodVirtual
base Method call
base MethodVirtual call
base Method call
base MethodVirtual call
base Method call
base MethodVirtual call
base Method call
TestShape       End

TestDerive      Start
circle override MethodVirtual
base Method call
base MethodVirtual call
base Method call
triangle new MethodVirtual
triangle new Method
Diamond default MethodVirtual
Diamond default Method
TestShape       End

TestDerive2     Start
circle override MethodVirtual
base Method call
base MethodVirtual call
base Method call
base MethodVirtual call
base Method call
base MethodVirtual call
base Method call
TestDerive2     End



 

转自:《编写高质量代码改善C#程序的157个建议》陆敏技




原标题:编写高质量代码改善C#程序的157个建议——建议94:区别对待override和new

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

中国Eblke品牌如何抢占美国市场?本土化营销是关键!:https://www.kjdsnews.com/a/1512248.html
TikTok品牌出海:打造独特内容,提升品牌影响力:https://www.kjdsnews.com/a/1512249.html
OA联盟舱位紧张,7月第一周欧美物流怎么发?:https://www.kjdsnews.com/a/1512250.html
跨境电商如何做好产品调研,在竞争中脱颖而出实现抢单抢流量:https://www.kjdsnews.com/a/1512251.html
四家刷评公司被亚马逊起诉:https://www.kjdsnews.com/a/1512252.html
MSDS报告是什么意思,MSDS查询网锂离子电池MSDS认证:https://www.kjdsnews.com/a/1512253.html
6个技巧帮助你的谷歌搜索广告投放快速出单:https://www.kjdsnews.com/a/1840804.html
登顶女性类目第一,它靠生理裤营收上亿美金:https://www.kjdsnews.com/a/1840805.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流