我有一个带有一些虚函数的类,让我们假装这是其中之一:
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被该定义覆盖。我需要能够在类定义中定义默认行为,并且只根据需要覆盖它,不同的时间不同,并且我不想扩散一堆子类来执行此操作。
我知道我需要使用代理或者类似的东西,但是我已经离开了语法游戏的时间太长了,谷歌给了我太多不相关的信息。
答案 0 :(得分:6)
您可以使用委托或Func
来执行此操作。
首先,将其添加到AClassWhatever
班级:
public Func<string, string> DoAThingToAString = (x) => x + "blah";
现在您可以使用相同的语法覆盖操作。
AClassWhatever instance = new AClassWhatever()
{
DoAThingToAString = (x) => x + x + " fill my eyes."
};
答案 1 :(得分: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 + "..."
答案 2 :(得分: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";
}
}