簡體   English   中英

C#:繼承和IDisposable-奇怪的問題

[英]C#: Inheritance and IDisposable - strange issue

任何人都可以幫忙,我有一個小問題,當我嘗試執行操作時,我有一個界面以及一個基本界面

  .Dispose()

它找不到在我的子類NOT base上實現的方法,而且它似乎總是想調用該方法-即使我將命名空間專門放在構造函數的參數前面。

這里有一些代碼可以更好地解釋它,基本上有2個IhouseRepository(接口),1個是基本接口,一個是子類接口。

在構造函數中,我專門說過它的MarkSmith.Data(而不是MarkSmith.DataBase),但是它會繼續使用未實現Dispose的DataBase版本。

我的想法是在所有子類中實現IDisposable,並且應該負責處理。

在構造函數中,我放了一行調用IhouseRepository的行,並且我通過“ CAN”訪問Dispose-這樣就可以了-為什么在不傳遞給構造函數的參數上在這里起作用,這是一個謎:-)

但是構造函數上的參數似乎正在強制命名空間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
            }
        }

重載的Dispose()方法不需要是virtual以便子類可以覆蓋其實現嗎? 否則,最終被調用的方法將取決於您通過其調用的接口。

另外,如果要求所有子類都實現IDisposable ,則基類也應實現IDisposable -這使編譯器強制實施它。

如果遵循推薦的模式,則HouseRepository中的Dispose方法不是虛擬的。 這意味着將要調用的是靜態決定的編譯時間,具體取決於您用於訪問它的變量的類型-而不是變量中實例的類型。

這只是一般性的考慮,但是這是我所能做的,因為在您的代碼示例中不存在存儲庫的成員定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM