0

我有以下类层次结构 -

//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) 有什么问题吗?这个设计有问题吗?如何改进?

4

2 回答 2

1

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

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

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

于 2012-06-18T13:51:05.927 回答
1

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

只要您base.Dispose正确调用并且只担心将本地内容放置到当前类而不是基类中,这将很好 - 因为您依赖于base.Dispose为您执行此操作。

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

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

于 2012-06-18T13:51:15.253 回答