簡體   English   中英

在派生類的構造函數中創建要傳遞給基類構造函數的委托

[英]Creating delegates to pass to base class constructor in constructor of derived class

我有一個繼承BaseClass的類DerivedClass。 BaseClass具有一個構造函數,該構造函數采用兩個委托和一個看起來像這樣的字符串:

public BaseClass(Func<string, bool> stringToBool, Func<string, string> stringToString)
{
    ... 
}

在DerivedClass中,我希望有一個默認的構造函數,該構造函數調用基本構造函數,傳入以簡單的“默認”方式工作的委托,例如stringToBool始終返回false,或者stringToString始終返回傳遞給它的字符串。 我該怎么做?

class BaseClass
{
    public BaseClass(Func<string, bool> stringToBool, Func<string, string> stringToStirng)
    {

    }
}


class DerivedClass : BaseClass
{
    public DerivedClass() : base(s => true, s => s)
    {

    }
}

根據您對“默認方式”的使用,我相信這是您真正想要的:

public class BaseClass {
    public BaseClass(
        Func<string, bool> stringToBool = null,
        Func<string, string> stringToString = null
    ){
        stringToBool = stringToBool ?? DefaultStringToBool;
        stringToString = stringToString ?? DefaultStringToString;
    }

    private static bool DefaultStringToBool(string s) {
        <Insert default logic here>;
    }

    private static string DefaultStringToString(string s) {
        <Insert default logic here>;
    }
}

然后,您甚至根本不需要接觸構造函數的基本知識,除非您想覆蓋該默認邏輯。

但是,您實際上根本不應該這樣做,因為它緊密地耦合了您的課程。

最好只是這樣做:

public abstract class BaseClass {

    protected virtual bool DefaultStringToBool(string s) {
        <Insert default logic here>;
    }

    protected virtual string DefaultStringToString(string s) {
        <Insert default logic here>;
    }
}

public DerivedClass : BaseClass {
    protected override string DefaultStringToString(string s) {
        <Insert override logic here>;
    }
}

如果將Funcs傳遞給實例化方法,則系統中存在設計缺陷,因為類已經可以具有可重寫的方法,抽象方法,虛擬方法等。

暫無
暫無

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

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