亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

編寫高質量代碼改善C#程序的157個建議——建議94:區別對待override和new

2019-11-14 14:04:51
字體:
來源:轉載
供稿:網友

建議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個建議》陸敏技


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久免费视频网站| 26uuu久久噜噜噜噜| 欧美在线一区二区三区四| 色婷婷**av毛片一区| 国产精品久久国产精品99gif| 日韩欧美在线观看| 欧美日韩爱爱视频| 91沈先生在线观看| 米奇精品一区二区三区在线观看| 欧美整片在线观看| 国产香蕉一区二区三区在线视频| 欧美激情一级精品国产| 最近2019中文字幕大全第二页| 亚洲国产精品免费| 中国china体内裑精亚洲片| 日韩a**中文字幕| 国产精品亚洲精品| 久久综合久久88| 日韩欧美极品在线观看| 亚洲欧美日韩精品久久奇米色影视| 日韩久久免费电影| 国产色视频一区| 久久久精品视频成人| 国产亚洲欧洲黄色| 欧美精品免费看| 国产精品久久久久久久久久ktv| 欧美最猛性xxxxx亚洲精品| 国产精品网红直播| 不卡av电影在线观看| 夜夜嗨av一区二区三区四区| 日韩在线观看免费av| 久久久精品久久久久| 亚洲美女福利视频网站| 久久视频在线免费观看| 日韩欧美精品网址| 91日韩在线视频| 在线观看欧美视频| 日韩在线观看成人| 欧洲成人性视频| 韩日精品中文字幕| 国产精品亚洲视频在线观看| 亚洲天堂第一页| 亚洲欧洲视频在线| 成人乱人伦精品视频在线观看| 国产成人91久久精品| 亚洲乱码av中文一区二区| 久久99久国产精品黄毛片入口| 91欧美视频网站| 亚洲乱码国产乱码精品精| 91精品在线播放| 亚洲精品99久久久久| 中文字幕日韩精品有码视频| 中文欧美日本在线资源| 亚洲午夜av久久乱码| 成人免费网站在线看| 亚洲三级黄色在线观看| 热re99久久精品国产66热| 日本高清+成人网在线观看| 国产精品永久免费观看| 国产欧美日韩中文| 最近2019免费中文字幕视频三| www.日韩视频| 久久国产精品影片| 日韩av在线免费观看| 欧洲亚洲免费视频| 国产精品免费网站| 久久久久久久成人| 亚洲美女激情视频| 久久黄色av网站| 美女性感视频久久久| 国产精品第一区| 欧美黑人巨大精品一区二区| 国产一区二区三区高清在线观看| 91九色蝌蚪国产| xxx成人少妇69| 欧美激情xxxx性bbbb| 日韩国产精品亚洲а∨天堂免| 色悠悠久久久久| 亚洲性视频网站| 亚洲网站在线播放| 欧美在线观看视频| 欧美情侣性视频| 亚洲欧美另类国产| 成人h片在线播放免费网站| 欧美激情aaaa| 美女扒开尿口让男人操亚洲视频网站| 亚洲精品美女久久久久| 久久久久久亚洲| 久久97精品久久久久久久不卡| 欧美夜福利tv在线| 日韩精品中文字幕有码专区| 高潮白浆女日韩av免费看| 亚洲精品久久7777777| 日韩美女中文字幕| 日韩福利在线播放| 欧美亚洲激情在线| 亚洲最大福利网站| 成人h猎奇视频网站| 国产精品xxxxx| 国产精品欧美日韩| 亚洲美女av电影| 8x海外华人永久免费日韩内陆视频| 精品一区二区电影| 91av免费观看91av精品在线| 久久99青青精品免费观看| 国产成人精品电影久久久| 日韩av快播网址| 国产精品欧美激情在线播放| 欧美日韩国产在线看| 欧美大片欧美激情性色a∨久久| 欧美激情亚洲综合一区| 色偷偷av一区二区三区乱| 国产ts一区二区| 黄网站色欧美视频| 欧美午夜片在线免费观看| 亚洲的天堂在线中文字幕| 色老头一区二区三区在线观看| 九九久久久久99精品| 成人h视频在线| 亚洲黄页视频免费观看| 国产精品亚洲美女av网站| 亚洲女同性videos| 深夜精品寂寞黄网站在线观看| 国产成人涩涩涩视频在线观看| 国产精品专区h在线观看| 中文字幕亚洲综合久久| 国产成人精品视频| 欧美午夜www高清视频| 国产精品久久久久免费a∨| 国产成人在线一区二区| 午夜免费久久久久| 亚洲精品日韩激情在线电影| 51ⅴ精品国产91久久久久久| 精品少妇v888av| 国产精品偷伦视频免费观看国产| 亚洲图中文字幕| 亚洲资源在线看| 成人黄色片在线| 日韩有码视频在线| 精品福利樱桃av导航| 国产成人小视频在线观看| 亚洲欧美在线一区| 欧美精品激情在线观看| 91久久久久久久久久久| 久久中文字幕在线视频| 国内精品一区二区三区四区| 欧美劲爆第一页| 久久影视三级福利片| 国产在线不卡精品| 国产精品网站视频| 亚洲精品日韩在线| 日韩av在线免费观看| 国精产品一区一区三区有限在线| 亚洲乱码国产乱码精品精| 国产精品免费久久久久久| 97在线免费观看| 日韩欧美主播在线| 亚洲人a成www在线影院| www.日韩不卡电影av| 精品国产欧美成人夜夜嗨| 欧美与黑人午夜性猛交久久久| 欧美日韩一区二区三区| 国产精品极品尤物在线观看| 亚洲高清色综合|