8

我有一个带有一些虚函数的类,让我们假设这是其中之一:

public class AClassWhatever
{
    protected virtual string DoAThingToAString(string inputString)
    {
        return inputString + "blah";
    } 
}

我想在重写“DoAThingToAString”内联的同时实例化这个类,就像我可以在声明中内联声明属性一样,如下所示:

...

AClassWhatever instance = new AClassWhatever
{
    DoAThingToAString = new function(string inputString)
    {
        return inputString + inputString + " fill my eyes."
    }
}

...

现在对于“实例”,DoAThingToAString 被该定义覆盖。我需要能够在类定义中定义默认行为,并且只根据需要覆盖它,不同的时间不同,我不想增加一堆子类来做到这一点。

我知道我需要使用委托或类似的东西,但我已经离开语法游戏太久了,谷歌给了我太多不相关的信息。

4

3 回答 3

8

您可以使用 delegates 或Funcs 来执行此操作。

首先,将此添加到您的AClassWhatever课程中:

public Func<string, string> DoAThingToAString = (x) => x + "blah";

现在您可以使用相同的语法来覆盖该操作。

AClassWhatever instance = new AClassWhatever()
{
    DoAThingToAString = (x) => x + x + " fill my eyes."
};
于 2013-05-24T18:20:15.810 回答
5

你不能用方法来做,但你可以用委托/匿名方法做同样的事情:

public class AClassWhatever
{
    public AClassWhatever()
    {
        this.DoAThingToAString = this.DoAThingToAStringImpl;
    }

    public Func<string, string> DoAThingToAString { get; set; }

    protected virtual string DoAThingToAStringImpl(string input)
    {
        return input + input + " fill my eyes.";
    }
}

用法:

var instance = new AClassWhatever
{
    DoAThingToAString = inputString => inputString + inputString +
        " fill my eyes something other than the default behavior."
}

var result = instance.DoAThingToAString("input");

请注意,inputString => inputString + inputString + "..."x => x + x + "..."

于 2013-05-24T18:20:35.210 回答
0

为什么不定义一个委托属性并在调用方法时使用该定义(如果它存在)?在对象的实例化中,您可以使用该属性提供替代定义。

例如:

public MyDelegateTypeThatMatchesMyFunctionCall DoAThingToAStringProperty { get; set; }

public class AClassWhatever
{
    protected virtual string DoAThingToAString(string inputString)
    {
        var handler = this.DoAThingToAStringProperty;
        if (handler)
        {
            return handler(inputString);
        }

        // do default behavior
        return inputString + "blah";
    } 
}

如果您想确保您的委托属性覆盖虚拟方法的任何覆盖定义,您可以这样做:

public MyDelegateTypeThatMatchesMyFunctionCall DoAThingToAStringProperty { get; set; }

public class AClassWhatever
{
    protected string DoAThingToAString(string inputString)
    {
        var handler = this.DoAThingToAStringProperty;
        if (handler)
        {
            return handler(inputString);
        }

        // do default behavior
        return DoAThingToAStringInternal(inputString);
    } 

    protected virtual string DoAThingToAStringInternal(string inputString)
    {
        // do default behavior
        return inputString + "blah";
    } 
}
于 2013-05-24T18:23:16.100 回答