C# 抽象类层次结构中的IDisposable实现

C# 抽象类层次结构中的IDisposable实现,c#,.net,abstract-class,idisposable,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 Disp

我有以下的类层次结构-

//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...

我想处理
absClass2
absDerived
中的对象,在这两个类中重写dispose(bool)是否有问题?这个设计有什么问题吗?如何改进这一点

这是正确的,无论引用的类型如何,如果对象是
absDervied
一旦absClass1类Dispose()调用虚拟Dispose(bool)则调用引用上的
Dispose()
将调用所有类上的
Dispose
方法,直到
absClass1

该方法(在
absClass1
上)调用虚拟方法
Dispose(bool)
,该方法调用派生度最高的方法(在
absDerived
)base.Dispose(disposing)调用最近的基类(即
absClass2
)上的方法,该方法还包含对
base.Dispose(disposing)的调用
调用
absClass1
上的方法

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

这目前不会编译,但由于您没有问为什么它不会编译,我猜您只是为了简洁起见省略了
void Dispose()
定义

只要您正确地调用
base.Dispose
,并且只担心处理当前类的本地内容而不是基类中的内容,这就可以了,因为您依赖
base.Dispose
来为您执行此操作

调用
base。
只调用当前类型的直接基类型,因此在您的情况下,
absDerived
转到
absClass2
,它转到
absClass


我唯一的观察是,在调用
base.Dispose
之前,您需要小心处理当前类型的内容。根据内容之间的关系,您可能希望先处理基本内容,然后处理当前类型,但这完全取决于您实际处理的内容以及顺序是否重要。

在何处执行GC.SuppressFinalize(this)@MAfifi,我不会使用GC.SuppressFinalize,因为我们没有使用任何析构函数,也不想自动执行Dispose调用,我们依赖于确保所有对象都显式地被释放。感谢Adam,是的,我故意离开Dispose(),它在Absclas1中。