为什么 class 实现 IDispose 没有 OnDisposed 覆盖?
Why does class implementing IDispose not have OnDisposed override?
我有一个具有以下定义的 class,我希望它具有 Dispose 方法的覆盖:
编辑
事实证明有一个 Dispose() 方法,但它不是覆盖。我期待一个覆盖。这可能是一个无效的问题....但为什么不是覆盖?
public class MyClient : IMyClient2
{
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if(disposing)
{
Stop();
}
}
}
它扩展的接口,以及它的后续接口,定义为:
public interface IMyClient2 : IMyClient
{
// one or two methods
}
public interface IMyClient : IDisposable
{
// a bunch of methods
}
我认为实现 IDisposable 需要我的 class 覆盖 Dispose()。但它并没有,我不知道我需要做什么才能做到这一点。
我需要做什么才能正确处理我的 class 实例?
如果您的 class 确实像问题中那样实现了这些接口,您应该得到
的编译错误
MyClass
does not implement interface member IDisposable.Dispose()
添加 public void Dispose()
实现后即会解决
更新:
it turns out there is a Dispose() method, but it's not an override. I was expecting an override. This may be an invalid question.... but why isn't it an override?
override
关键字用于从基础 class 覆盖 abstract
或 virtual
方法。当您实现接口时,不需要关键字。 MSDN 在 override keyword:
上声明
The override modifier is required to extend or modify the abstract or virtual implementation of an inherited method, property, indexer, or event.
如果您扩展基 class 而不是接口,并且 Dispose
方法将具有 abstract
或 virtual
关键字,您可以 override
它在派生的 class.
中实现
以object
的ToString()
为例:
public class Object
{
// Returns a String which represents the object instance. The default
// for an object is to return the fully qualified name of the class.
//
public virtual String ToString()
{
return GetType().ToString();
}
}
如果在您的 class 中,您将添加一个功能:
public override string ToString()
{
// Add your implementation
}
I thought that implementing IDisposable would require that my class have the Dispose() override. But it doesn't and I don't know what I need to do to make it so that it does.
更改基数class
public class MyClient : IMyClient2
{
public virtual void Dispose()
{
Dispose(true);
}
}
你的新类型
public class MyClient2 : MyClient
{
public override void Dispose()
{
// add your dispose information
base.Dispose(true);
}
}
这将允许派生自您的 MyClient
类型的类型也实现它们自己对 Dispose
方法的覆盖。不需要在覆盖类型中实现 Dispose
。如果需要,则必须使用抽象 Dispose 方法将 MyClient
class 标记为抽象。
更改基数class
public abstract class MyClient : IMyClient2
{
public abstract void Dispose()
{
Dispose(true);
}
}
你的新类型
public class MyClient2 : MyClient
{
public override void Dispose()
{
// add your dispose information
base.Dispose(true);
}
}
I thought that implementing IDisposable would require that my class have the Dispose() override. But it doesn't and I don't know what I need to do to make it so that it does.
没有。接口不使用 abstract/virtual/override
关键字。作者实现了接口,没有重写任何虚方法
注意 IDisposable 定义中没有 virtual/abstract
:
public interface IDisposable
{
void Dispose();
}
why isn't it an override?
作者本可以选择遵循最佳实践并提供 protected virtual void Dispose(bool disposing)
但他没有选择。
我猜他没想到你会想要延长 class.
你现在可以做什么?
如果您有权更改代码,那么您可以继续并根据需要实施 IDisposable。例如。 https://msdn.microsoft.com/en-us/library/ms244737.aspx
如果您不能更改代码,那么您还有其他选择。您可以使用 composition/decorator 模式来提供您自己的 Dispose 实现。
您可以继承自 MyClient
,然后自己明确提供 Dispose 的实现。释放对象时,将调用与接口关联的方法。
这实际上与覆盖相同。例如:
public class MyClient2 : MyClient
{
void IDisposable.Dispose()
{
base.Dispose();
//Do whatever you like here.
}
}
我有一个具有以下定义的 class,我希望它具有 Dispose 方法的覆盖:
编辑
事实证明有一个 Dispose() 方法,但它不是覆盖。我期待一个覆盖。这可能是一个无效的问题....但为什么不是覆盖?
public class MyClient : IMyClient2
{
public void Dispose()
{
Dispose(true);
}
private void Dispose(bool disposing)
{
if(disposing)
{
Stop();
}
}
}
它扩展的接口,以及它的后续接口,定义为:
public interface IMyClient2 : IMyClient
{
// one or two methods
}
public interface IMyClient : IDisposable
{
// a bunch of methods
}
我认为实现 IDisposable 需要我的 class 覆盖 Dispose()。但它并没有,我不知道我需要做什么才能做到这一点。
我需要做什么才能正确处理我的 class 实例?
如果您的 class 确实像问题中那样实现了这些接口,您应该得到
的编译错误
MyClass
does not implement interface memberIDisposable.Dispose()
添加 public void Dispose()
实现后即会解决
更新:
it turns out there is a Dispose() method, but it's not an override. I was expecting an override. This may be an invalid question.... but why isn't it an override?
override
关键字用于从基础 class 覆盖 abstract
或 virtual
方法。当您实现接口时,不需要关键字。 MSDN 在 override keyword:
The override modifier is required to extend or modify the abstract or virtual implementation of an inherited method, property, indexer, or event.
如果您扩展基 class 而不是接口,并且 Dispose
方法将具有 abstract
或 virtual
关键字,您可以 override
它在派生的 class.
以object
的ToString()
为例:
public class Object
{
// Returns a String which represents the object instance. The default
// for an object is to return the fully qualified name of the class.
//
public virtual String ToString()
{
return GetType().ToString();
}
}
如果在您的 class 中,您将添加一个功能:
public override string ToString()
{
// Add your implementation
}
I thought that implementing IDisposable would require that my class have the Dispose() override. But it doesn't and I don't know what I need to do to make it so that it does.
更改基数class
public class MyClient : IMyClient2
{
public virtual void Dispose()
{
Dispose(true);
}
}
你的新类型
public class MyClient2 : MyClient
{
public override void Dispose()
{
// add your dispose information
base.Dispose(true);
}
}
这将允许派生自您的 MyClient
类型的类型也实现它们自己对 Dispose
方法的覆盖。不需要在覆盖类型中实现 Dispose
。如果需要,则必须使用抽象 Dispose 方法将 MyClient
class 标记为抽象。
更改基数class
public abstract class MyClient : IMyClient2
{
public abstract void Dispose()
{
Dispose(true);
}
}
你的新类型
public class MyClient2 : MyClient
{
public override void Dispose()
{
// add your dispose information
base.Dispose(true);
}
}
I thought that implementing IDisposable would require that my class have the Dispose() override. But it doesn't and I don't know what I need to do to make it so that it does.
没有。接口不使用 abstract/virtual/override
关键字。作者实现了接口,没有重写任何虚方法
注意 IDisposable 定义中没有 virtual/abstract
:
public interface IDisposable
{
void Dispose();
}
why isn't it an override?
作者本可以选择遵循最佳实践并提供 protected virtual void Dispose(bool disposing)
但他没有选择。
我猜他没想到你会想要延长 class.
你现在可以做什么?
如果您有权更改代码,那么您可以继续并根据需要实施 IDisposable。例如。 https://msdn.microsoft.com/en-us/library/ms244737.aspx
如果您不能更改代码,那么您还有其他选择。您可以使用 composition/decorator 模式来提供您自己的 Dispose 实现。
您可以继承自 MyClient
,然后自己明确提供 Dispose 的实现。释放对象时,将调用与接口关联的方法。
这实际上与覆盖相同。例如:
public class MyClient2 : MyClient
{
void IDisposable.Dispose()
{
base.Dispose();
//Do whatever you like here.
}
}