C# 在实例化类时重写虚拟方法

C# 在实例化类时重写虚拟方法,c#,C#,我有一个带有一些虚拟函数的类,让我们假设这是其中之一: public class AClassWhatever { protected virtual string DoAThingToAString(string inputString) { return inputString + "blah"; } } 我希望在重写“DoAThingToAString”内联时实例化此类,就像我可以在声明中内联声明属性一样,如下所示: ... AClassWha

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

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被该定义覆盖。我需要能够在类定义中定义默认行为,并且只在需要时重写它,不同的时间不同,我不想为了实现这一点而大量增加一堆子类


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

你可以使用委托或
Func
s来实现这一点

首先,将其添加到
aclassswhatever
类中:

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

不能使用方法,但可以使用委托/匿名方法执行相同的操作:

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.";
    }
}

请注意,
inputString=>inputString+inputString+“…”
x=>x+x+“…”

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

例如:

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";
    } 
}

“我需要能够在类定义中定义默认行为…”@mellamokb我更改了答案,以便在构造函数中提供默认实现。我之所以给你答案,是因为更好的编码,但也许你对我在注释中问gunr2171的调用方问题有一个答案?@kamii而不是使用this指针,只要使用引用本身。@Dan,我想他的问题是,当重载函数时,他将无法从函数中使用实例变量的私有成员。这是我一直在寻找的语法,但这是一个愚蠢的问题。在doAthingToString中,我使用的是从控制器操作调用的控制器扩展方法,例如:
this.DoExtensionMethod(someString)现在我在Func定义中,不再有对“this”的引用。有没有办法获取对调用方的引用,或者我必须将其与其他输入一起传递?@kamii,您必须传递对对象的引用,或者您需要的任何其他特定值。这是一个匿名函数,因此它不知道该实例。(请核实我的情况)。
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";
    } 
}