簡體   English   中英

實現派生類接口方法的抽象基類

[英]Abstract base class implementing derived class interface methods

我有以下類和接口。 我想從本質上凍結IOld接口(將不贊成使用),並強迫用戶使用INew接口,該接口將包含與IOld相同的方法。 但是,INew方法Meth3表示與IOld Meth2相同的功能,但是返回類型不同,為了更好地區分它們,我認為這種設計是合適的。 我的問題是,這被認為是良好的編碼習慣嗎?

注意:IOld和INew存在於單獨的程序集中。 NewClass不能以任何方式引用IOld,因為它將作為可遠程(MarshalByRef)對象公開,客戶端將通過INew接口連接到該對象。 我不希望新客戶引用IOld程序集。

public interface IOld
{
    void Meth1();
    double Meth2(int input);
} 

public interface INew
{
    void Meth1();
    float Meth3(int input);
} 

public abstract class BaseClass
{
    public virtual void Meth1()
    {
    } 

    public virtual double Meth2(int input)
    {
        throw new NotImplementedException();
    } 
} 

public class OldClass
:
    BaseClass,
    IOld
{
    public override double Meth2(int input)
    {
        return 0;
    } 
} 

public class NewClass
:
    BaseClass,
    INew
{
    public float Meth3(int input)
    {
        return 0;
    } 
}

坐下來,用堅實的基礎建造金字塔。 設置方式,抽象基類和接口是實現同一概念的相互競爭的方法。 您這樣做主要是為了促進新舊兩難,但是當您這樣做時,最終會得到一個相當時髦的依賴圖。

使用您編寫的內容,唯一的棘手就是具有相同簽名的方法。 如果不是這個問題,您可以輕松擴展舊界面,而不會遇到問題。 如果該方法改變了,它是重構更改(可以接受)還是完全不同的結果? 換句話說,舊客戶可以呼叫新客戶嗎? 如果是這樣,也不需要在其他接口上使用該方法。

確保您不贊成使用這些方法,以便用戶知道他們將丟失舊的方法。 還要確保記錄在案。

我會嘗試這樣的事情:

public class OldClass : BaseClass, IOld
{
    public override double Meth2(int input)
    {
        return 0.0;
    }
}

public class NewClass : OldClass, INew // now implements IOld and INew using the Method2() from OldClass
{
    [Obsolete("This method is deprecated . Use Method3() instead.")]
    public override double Meth2(int input)
    {
        return base.Meth2(input);
    }
    public float Meth3(int input)
    {
        return return 0.0f;
    }
}

最好將方法標記為不推薦使用,以告知開發人員他們需要更新代碼,而不是通過殺死舊方法來破壞代碼,這是一種更好的做法。

我寧願添加一個名稱稍有不同的新方法,而不是創建新接口。

因此,舊的接口將是例如:

public interface IOld
{
    void Meth1();
    [Obsolete("Use Meth22 instead.")]
    double Meth2(int input);
    float Meth22(int input);
} 

暫無
暫無

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

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