Do继承会自动被C#中的所有子类继承

  • 本文关键字:继承 子类 Do c#
  • 更新时间 :
  • 英文 :


我刚刚用一个简单的using((语句测试了一些东西。

获得2个课程:儿童和家长

public class Parent : IDisposable
{
public void Dispose()
{
// disposing stuff
}
}
public class Child : Parent
{
public void Dispose()
{
// disposing stuff
}
}

现在,当我开始使用using((语句时:

using(Parent = new Parent()){}

Dispose确实为父调用

using(Child = new Child()){}

Dispose不称为

除非我特别添加:

public class Child : Parent, IDisposable

还是我忽略了什么?

我假设您的Dispose方法不是virtual,并且您在Child中也有一个Dispose方法。问题是,当您将Child强制转换为IDisposable(using隐式执行此操作(时,编译器将绑定到Parent中的Dispose方法,因为这是实现IDisposable的类型。如果Disposevirtual,那么在运行时绑定器将在Child类中查找Dispose的覆盖并调用它。

public class Parent : IDisposable
{
public virtual void Dispose()
{
Console.WriteLine("In Disposed");
}
}
public class Child : Parent
{
public override void Dispose()
{
Console.WriteLine("In Child Disposed");
}
}

或者,如果Child实现了IDisposable(这似乎是多余的(,那么对IDisposable的强制转换将绑定到Child上的Dispose方法,而不是Parent

public class Parent : IDisposable
{
public void Dispose()
{
Console.WriteLine("In Disposed");
}
}
public class Child : Parent, IDisposable
{
public void Dispose()
{
Console.WriteLine("In Child Disposed");
}
}

请注意,在任何一种情况下,您都应该从子Dispose方法调用父Dispose方法,无论您是重写还是自己实现接口。这样可以确保父类所拥有的任何非托管资源也得到释放。

public override void Dispose()
{
Console.WriteLine("In Child Disposed");
base.Dispose();
}

最新更新