我有以下类层次结构 -
//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)有什么问题吗?这个设计有什么问题吗?如何改进?
答案 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
之前需要小心处理当前类型的东西。根据材料的相关性,您可能需要先处理基本材料,然后再处理当前类型 - 但这完全取决于您实际处理的内容以及订单是否重要。