C#類中虛方法相互調用的潛在重載錯誤

來源:互聯網
上載者:User
    當我們編寫基類虛方法時,需要注意一個問題,就是基類中虛方法的相互調用,有可能引起衍生類別重載時的潛在錯誤隱患。當然這個錯誤並不是C#語言設計的缺陷,而是一個不可避免的實現而已。當然如果我們是要編寫通用的組建基類,就需要注意一下了。

    或許我們剛開始做OOP的時候,對於有沒有方法有沒有virtual根本不在乎,很多是時候我們都重寫了(rewrite)了基類方法。當然在需要確定重載(override)的時候,virtual關鍵字限定基類方法是不可少的。那麼是不時我們就可以把基類的方法都弄成virtual修飾的呢?這樣雖然在大多時候沒有問題,而其如果是自己重載自己的基類出問題的可能性也不大,可是如果是別人來繼承基類,那麼問題可能就來了。

    當我們重載不確切的基類是,最好的習慣是調用以下base的同名方法,這個在控制項開發時用的更加普遍。可是這個時候,如果基類之間存在虛方法調用了別的被重載的虛方法,潛在錯誤就出來了。看下面樣本(由xingd提供,我修改):

using System;

public class Base
{
    public virtual void Foo()
    {
        Console.WriteLine("Base::Foo");
        this.Bar();
    }
    public virtual void Bar()
    {
        Console.WriteLine("Base::Bar");
    }
};

public class Derived : Base
{
    private Object obj;
    public override void Foo()
    {
        Console.WriteLine("Derived::Foo");
        base.Foo();
        obj = new Object();
        this.Bar();
    }
    public override void Bar()
    {
        Console.WriteLine(obj.ToString());
        Console.WriteLine("Derived::Bar");
    }
};

public class Test
{
    public static void Main()
    {
        Derived b = new Derived();
        b.Foo();
    }
};

    編譯沒有錯誤,當然了,又不是在裡講C#文法。運行結果為:

   E:\Working\Doing>test
   Derived::Foo
   Base::Foo

   Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
     at Derived.Bar()
     at Derived.Foo()
     at Test.Main()

    問題代碼就是:

        Console.WriteLine("Derived::Foo");
        base.Foo();
        obj = new Object();
        this.Bar();

    
    由於base.Foo()中的this.Bar()方法已被重載,所以實際執行的是Derived::Bar,而這個時候我的obj還沒有初始化呢。

    當然修正這個bug也很容易,就是把Base::Bar變為非虛方法就可以了。由於C#可以靈活的設定virtual來控制方法是否需要重載,所以這類問題完全是由代碼的設計缺陷所引起的,而且如果由一個人來寫一般是不會設計出這樣的代碼的,可是如果基類和衍生類別由不同的人來寫,出這樣的錯誤的機會可能就會更大一些。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.