2012-06-18 61 views
0

IDisposable的實現,我有下面的類層次結構 -在抽象類層次

//Abstract Class1 in library1 (Can't modify this) 
public abstract class absClass1 : IDisposable 
{ 
    public abstract int AddTwoNumbers(int Num1, int Num2); 
    // Some other overrides, abstract methods and concrete methods 

    void Dispose() 
    { 
     // Standard Dispose impl. 
    } 
} 

//Abstract Class2 in library2 
public abstract class absClass2 : absClass1 
{ 
    //Implementing AddTwoNumbers 
    public override int AddTwoNumbers(int Num1, int Num2) 
    { 
     return Num1+Num2; 
    } 

    public abstract int MultiplyTwoNumbers(int Num1, int Num2); 

    // Some other overrides, abstract methods and concrete methods 

    protected override void Dispose(bool disposing) 
    { 
     if (!IsDisposed) 
     { 
      //Cleanup 
     } 

     base.Dispose(disposing); 
    } 
} 

//Derived class from absClass2 in library3 
public sealed class absDerived1 : absClass2 
{ 
    //Implementing MultiplyTwoNumbers 
    public override int MultiplyTwoNumbers(int Num1, int Num2) 
    { 
     return Num1*Num2; 
    } 

    // Some other overrides, abstract methods and concrete methods 

    protected override void Dispose(bool disposing) 
    { 
     if (!IsDisposed) 
     { 
      // Cleanup 
     } 

     base.Dispose(disposing); 
    } 
} 

//... Some more implementation of absClass2 like absDerived2 etc. 
// can be there in other library4... 

我想在處置兩absClass2absDerived對象,有沒有在這兩個重寫Dispose(布爾)這些類的任何問題?這個設計有什麼問題嗎?這怎麼能改進?

+0

你在哪裏執行GC.SuppressFinalize(this); ? –

+1

@MAfifi,我不會使用GC.SuppressFinalize,因爲我們沒有使用任何析構函數,也不想自動執行Dispose調用,所以我們依靠確保所有對象都被顯式地Dispose。 – akjoshi

回答

1

這個目前不會編譯,但是因爲你不問爲什麼它不能編譯,所以我猜測你只是簡單地忽略了void Dispose()的定義。

這將是罰款,只要你正確地調用到base.Dispose和只擔心處置的東西,當地當前類,而不是在一個基類 - 因爲你是靠base.Dispose爲你做到這一點。

調用base.<member>只調用當前類型的直接基類型,所以你的情況absDerivedabsClass2,都到absClass

我唯一的看法就是在撥打base.Dispose之前需要小心處置當前類型的東西。根據具體情況的不同,您可能需要首先處理基本內容,然後是當前類型 - 但這完全取決於您實際處理的內容以及訂單是否重要。

+0

感謝亞當,是的,我故意離開Dispose(),它在absClass1中。 – akjoshi

1

這是正確的,不管參考你的類型,如果對象absDervied然後一旦absClass1類的Dispose()調用虛的Dispose(布爾)然後調用Dispose()的引用將請在absClass1的所有課程上致電Dispose方法。

即方法(上absClass1)調用虛擬方法Dispose(bool),它調用最衍生的一種(上absDerived)的base.Dispose(disposing)調用最近的基類(即absClass2),其還包含對base.Dispose(disposing)呼叫它調用的方法方法absClass1

將該類結構放入控制檯應用程序中,將一些WriteLine語句放在Dispose方法中,當調用Dispose()時,您將看到它們全部被觸發。