实例化类时重写虚方法

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

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来执行此操作。

首先,将它添加到您的AClassWhatever类:

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

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

 AClassWhatever instance = new AClassWhatever() { DoAThingToAString = (x) => x + x + " fill my eyes." }; 

你不能用方法做,但你可以使用delegates / anonymous方法做同等的事情:

 public class AClassWhatever { public AClassWhatever() { this.DoAThingToAString = this.DoAThingToAStringImpl; } public Func 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 + "..."

为什么不定义委托属性并在调用方法时使用该定义? 在对象的实例化中,您可以使用该属性提供备用定义。

例如:

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