2012-06-18 65 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()时,您将看到它们全部被触发。