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

时间:2009-11-08 18:24:46

标签: c# inheritance idisposable

任何人都可以帮忙,我有一个小问题,我有一个界面,也有一个基础界面,当我尝试做

  .Dispose()

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

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

在构造函数中,我专门说了MarkSmith.Data(而不是MarkSmith.DataBase),但它仍然保持拾取未实现Dispose的DataBase版本。

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

在构造函数中,我有一行调用IhouseRepository并且我“CAN”访问Dispose - 所以它确实有效 - 为什么它在这里工作而不是传递给构造函数的param是一个谜: - )< / p>

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

我想我可以将基础项目上的所有接口重命名为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
            }
        }

2 个答案:

答案 0 :(得分:4)

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

此外,如果需要所有子类来实现IDisposable,那么基类也应该实现IDisposable - 这会导致编译器强制执行它。

答案 1 :(得分:1)

如果您遵循推荐的模式,那么HouseRepository中的Dispose方法不是虚拟的。这意味着将根据您用于访问它的变量的类型(而不是变量中的实例类型)静态确定将调用哪一个。

这只是一般注意事项,但这是我可以做的,因为在您的代码示例中,存储库的成员定义不存在。