国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:27:07
字體:
來源:轉載
供稿:網友

   當我們編寫基類虛方法時,需要注意一個問題,就是基類中虛方法的相互調用,有可能引起派生類重載時的潛在錯誤隱患。當然這個錯誤并不是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來控制方法是否需要重載,所以這類問題完全是由代碼的設計缺陷所引起的,而且如果由一個人來寫一般是不會設計出這樣的代碼的,可是如果基類和派生類由不同的人來寫,出這樣的錯誤的機會可能就會更大一些。

商業源碼熱門下載www.html.org.cn

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梓潼县| 梅河口市| 卫辉市| 五大连池市| 萨迦县| 连南| 泸西县| 南汇区| 大足县| 嘉定区| 专栏| 温州市| 旌德县| 射阳县| 宜兴市| 闽清县| 类乌齐县| 赤峰市| 四子王旗| 青海省| 阳江市| 万荣县| 贺州市| 大名县| 呼图壁县| 内黄县| 白河县| 隆林| 贡嘎县| 新平| 广灵县| 屯留县| 土默特右旗| 新泰市| 合山市| 通化县| 香格里拉县| 乌兰县| 乐安县| 水城县| 台中县|