gpt4 book ai didi

C#:继承和 IDisposable - 奇怪的问题

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:32 25 4
gpt4 key购买 nike

谁能帮忙,我有一个小问题,我有一个接口(interface),还有一个基本接口(interface),当我尝试做的时候

  .Dispose()

它没有找到在我的子类 NOT base 上实现的方法。它似乎总是想调用 base - 即使我专门将命名空间放在构造函数的参数前面。

这里有一些代码可以更好地解释它,基本上有2个IhouseRepository(接口(interface)),1个是基础接口(interface),一个是子类接口(interface)。

在构造函数中,我特别指出了它的 MarkSmith.Data(而不是 MarkSmith.DataBase),但它会继续获取未实现 Dispose 的 DataBase 版本。

我的想法是在所有子类中实现 IDisposable 并且应该负责处理。

在构造函数中,我放了一行调用 IhouseRepository 并且我“可以”访问 Dispose - 所以它确实有效 - 为什么它在这里起作用而不是在传递给构造函数的参数上起作用是一个谜:-)

但是构造函数上的参数似乎强制使用命名空间 DataBase 而不是 Data

我想我可以将基础项目上的所有接口(interface)重命名为 IHouseRepositoryBase,但我不明白为什么会这样。

非常感谢任何帮助

public class HouseService : ServiceBase.HouseService, IHouseService
{
public HouseService(MarkSmith.Data.IHouseRepository repository)
: base(repository)
{

MarkSmith.Data.IHouseRepository test =
new MarkSmith.Data.HouseRepository(new MyDataContext);
test.Dispose(); // THIS WORKS! NO PROBLEMS
}

// Dispose() calls Dispose(true)
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}


protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// free managed resources
if (repository != null)
{
repository.Dispose(); // THIS FAILS .. IT IS CALLING NS DATABASE
}
}

最佳答案

你是不是重载了Dispose()方法需要是 virtual以便子类可以覆盖它的实现?否则,最终被调用的方法将取决于您通过哪个接口(interface)调用它。

此外,如果要求所有子类都实现IDisposable , 那么基类应该实现 IDisposable同样——这会导致编译器强制执行它。

关于C#:继承和 IDisposable - 奇怪的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1697427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com