我有一个具有以下定义的类,我希望它覆盖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会要求我的类具有Dispose()覆盖。但事实并非如此,我不知道我需要做些什么才能做到这一点。
我需要做些什么才能妥善处理班级实例?
答案 0 :(得分:2)
如果你的类真的在问题中实现了这些接口,你应该得到编译错误
MyClass
未实现接口成员IDisposable.Dispose()
在您添加public void Dispose()
实施
<强>更新强>
从基类覆盖事实证明有一个Dispose()方法,但它不是一个覆盖。我期待一个覆盖。这可能是一个无效的问题....但为什么不是一个覆盖?
override
或abstract
方法时,使用 virtual
关键字。在实现接口时,不需要关键字。由override keyword上的MSDN声明:
需要使用override修饰符来扩展或修改继承的方法,属性,索引器或事件的抽象或虚拟实现。
如果不是接口而是扩展基类,而Dispose
方法会有abstract
或virtual
个关键字,您可以override
在派生类中实现它
以object
的{{1}}为例:
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();
}
}
答案 1 :(得分:1)
我认为实现IDisposable会要求我的类具有Dispose()覆盖。但它并没有,我也不知道我需要做些什么才能做到这一点。
更改基类
int assign(int a[NROW][NCOL], int starting_no)
{
int x, y, old_starting_no;
old_starting_no = starting_no;
for (x = 0; x<NROW; x++)
{
starting_no = old_starting_no;
for (y = 0; y<NCOL; y++)
{
a[x][y] = starting_no;
starting_no += x;
}
}
return a[NROW-1][NCOL-1];
}
您的新类型
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
您的新类型
public abstract class MyClient : IMyClient2
{
public abstract void Dispose()
{
Dispose(true);
}
}
答案 2 :(得分:0)
我认为实现IDisposable会要求我的类具有Dispose()覆盖。但事实并非如此,我不知道我需要做些什么才能做到这一点。
没有。接口不使用abstract/virtual/override
个关键字。作者已经实现了接口,而不是覆盖任何虚拟方法。
注意IDisposable定义中没有virtual/abstract
:
public interface IDisposable
{
void Dispose();
}
为什么不是覆盖?
作者本可以选择遵循最佳做法并提供protected virtual void Dispose(bool disposing)
,但也不要选择
我猜他不会指望你想延长课程。
如果您有权更改代码,那么您可以继续执行IDisposable。例如。 https://msdn.microsoft.com/en-us/library/ms244737.aspx
如果您无法更改代码,那么您仍然可以选择。您可以使用composition / decorator模式来提供自己的Dispose实现。
您可以从MyClient
继承,然后为Dispose自己明确提供实现。当物体被丢弃时,它将是被称为接口的方法
这有效地与压倒一样。 E.g:
public class MyClient2 : MyClient
{
void IDisposable.Dispose()
{
base.Dispose();
//Do whatever you like here.
}
}