new 與 overdrive 差別

淺談 new 與 overdrive 差別

程式語言有一種現象跟82法則有點相似的感覺,那就是一般情況下一般人80%撰寫的程式只用到程式語言本身20%的功能,很多功能是為求彈性或是少數狀況方便而設計,但多數情況其實是備而不用(功能spec本來就是要超需求..用不到頂多不用,但缺spec就不行了),不過多知道一些感覺就是會比較有學問.

以跟override相似的new來說就是這樣,容易混淆,其實說真的完全不知道相似override的new功能也就算了,因為我連用都沒用過....至於這兩者有何差異???

有一篇解釋得很不錯 https://dotblogs.com.tw/skychang/2012/05/10/72114

我只是再簡化成更減單的sample,給自己方便記憶

第一個對照例子....

        class test1
        {
            public virtual void testa()
            {
                Console.WriteLine("1");
            }

            public void test()
            {
                testa();
            }
        }

        class test2 : test1
        {
            public new void testa()
            {
                Console.WriteLine("2");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            test1 a1 = new test2();
            a1.testa();//輸出1
        }
        class test1
        {
            public virtual void testa()
            {
                Console.WriteLine("1");
            }

            public void test()
            {
                testa();
            }
        }

        class test2 : test1
        {
            public override void testa()
            {
                Console.WriteLine("2");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            test1 a1 = new test2();
            a1.testa();//輸出2
        }

第二個對照例子

        class test1
        {
            public virtual void testa()
            {
                Console.WriteLine("1");
            }

            public void test()
            {
                testa();
            }
        }

        class test2 : test1
        {
            public new void testa()
            {
                Console.WriteLine("2");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            test2 a2 = new test2();
            a2.test();//輸出1
        }
        class test1
        {
            public virtual void testa()
            {
                Console.WriteLine("1");
            }

            public void test()
            {
                testa();
            }
        }

        class test2 : test1
        {
            public override void testa()
            {
                Console.WriteLine("2");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            test2 a2 = new test2();
            a2.test();//輸出2
        }

簡單來說...根本沒必要用new...當你真的哪天在特殊情況下不得不用時自然會去用到,否則當不知道new用法的存在也可以.