簡體   English   中英

從具有不同枚舉的基類覆蓋函數

[英]Override function from base class with a different enum

好的,標題聽起來有些混亂,只需閱讀我的解釋以了解我的意思:

我有一個基類,讓我們稱之為BaseProvider 這個類看起來像這樣:

public abstract class BaseProvider
{
    public abstract void NewItem(int type);
}

現在,我添加第二個類,該類派生自BaseProvider 讓我們稱之為TestProvider

public class TestProvider : BaseProvider
{
    public override void NewItem(int type)
    {

    }
}


好的,現在是我的問題:

由於此提供程序應能夠處理不同的子類型,因此我創建了參數int type 但是,能夠使用枚舉會更好。 而且,由於每個數據提供者都有不同的子類型集,因此我無法重用已經存在的子類型。 現在,我的方法簽名必須與基類中的簽名完全匹配,這使得無法將參數類型更改為枚舉(即使枚舉基本上是一個int)。

我確實嘗試如下定義派生類:

public class TestProvider : BaseProvider
{
    public override void NewItem(MyEnum type)
    {

    }
}

enum MyEnum : int
{
    TEST = 1
}

正如所言,這是行不通的...
所以我的問題是:

是否可以用從基類中定義的參數類型派生的其他參數類型覆蓋基函數? 如果是,怎么辦?

不,絕對不是-這就是原因...該代碼仍然必須工作:

BaseProvider provider = new TestProvider();
provider.NewItem(10);

這只是多態性的正常要求。 覆蓋時不能更改簽名,因為調用者可能會根據基類來考慮您的實例。 (實際上,如果他們沒有這樣做,為什么還要麻煩使用抽象方法呢?)

現在您可以重載該方法:

public override void NewItem(int type)
{
    NewItem((MyEnum) type);
}

public void NewItem(MyEnum type)
{
    ...
}

那不是完全一樣的東西,但是它可能實現您想要的。

或者,您可以使BaseProvider通用:

public abstract class BaseProvider<T>
{
    public abstract void NewItem(T type);
}

public class TestProvider : BaseProvider<MyEnum>
{
    public override void NewItem(MyEnum type)
    {
    }
}

您實際上錯過了在此處覆蓋的概念。 這與更改方法定義無關。 它與更改方法行為有關。 您可以在此處執行重載,或者確保在調用之前將enumint

暫無
暫無

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

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