Abstract类层次结构中的IDisposable实现

时间:2012-06-18 13:41:52

标签: c# .net abstract-class 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(bool)有什么问题吗?这个设计有什么问题吗?如何改进?

2 个答案:

答案 0 :(得分:1)

这是正确的,无论你有引用的类型,如果对象absDervied那么一旦absClass1类Dispose()调用虚拟Dispose(bool)然后在引用上调用Dispose()会将所有类的Dispose方法调用到absClass1

该方法(在absClass1上)调用虚拟方法Dispose(bool),该方法调用派生最多的方法(在absDerived上),base.Dispose(disposing)调用最近的基础上的方法class(即absClass2),其中还包含对base.Dispose(disposing)调用absClass1上的方法的调用。

将该类结构放在控制台应用程序中,在Dispose方法中放入一些WriteLine语句,当调用Dispose()时,您将看到它们全部触发。

答案 1 :(得分:1)

这当前不会编译,但是因为你没有问为什么它不编译我猜你只是为了简洁而省略void Dispose()定义。

只要你正确地调用base.Dispose并且只担心将当前类本地的东西放在基类中而不是在基类中 - 这是好的,因为你依靠base.Dispose来做这适合你。

调用base.<member>只会调用当前类型的直接基类型,因此在您的情况下absDerived转到absClass2,转到absClass

我唯一的观察是你在调用base.Dispose之前需要小心处理当前类型的东西。根据材料的相关性,您可能需要先处理基本材料,然后再处理当前类型 - 但这完全取决于您实际处理的内容以及订单是否重要。

相关问题