创建委托以在派生类的构造函数中传递给基类构造函数

时间:2017-10-07 02:49:42

标签: c# constructor delegates

我有一个DerivedClass类,它扩展了BaseClass。 BaseClass有一个构造函数,它接受两个委托和字符串,如下所示:

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

在DerivedClass中,我希望有一个默认构造函数,它调用基本构造函数,传入以简单的“默认”方式工作的委托,例如: stringToBool始终返回false,或者stringToString始终返回传递给它的字符串。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:0)

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

    }
}


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

    }
}

答案 1 :(得分:0)

根据您对“默认方式”这一短语的使用,我相信这是您真正想要的:

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传递给实例化方法,系统中存在设计缺陷,因为类已经可以使用可覆盖的方法,抽象方法,虚拟方法等。