在某种程度上,这更像是一个思考练习,而不是一个真正的问题,因为我没有足够的CustomFS类来使用复制粘贴特别困扰。但我想知道是否有更好的方法。
假设我有几个类CustomFS
,CustomFS2
等,所有这些类都继承自FS
,FS2
等FS / FS2 /等。所有都继承自FSG
,其函数为GetStuff
。假设我没有能力修改FS和FSG,我怎么能用只有一个CustomFS类覆盖许多FS / FS2中的特定函数,而不用FS构造CustomFS并为所有FS的方法添加包装函数customFS。
当前策略:复制/粘贴:
class CustomFS : FS
{
protected override int GetStuff(int x)
{
int retval = base.GetStuff(x);
return retval + 1;
}
}
class CustomFS2 : FS2
{
protected override int GetStuff(int x)
{
int retval = base.GetStuff(x);
return retval + 1;
}
}
答案 0 :(得分:1)
除非通过代理或通过Reflection.Emit发出自己的派生类,否则不能。
但是,如果您需要在每个类上执行更复杂的功能,则可能需要创建一个辅助方法(可能是通用的和静态的)来完成实际工作。
答案 1 :(得分:1)
如果我正确理解你的问题,这似乎非常适合策略设计模式:http://www.dofactory.com/patterns/patternstrategy.aspx
如果你的覆盖函数比几行更复杂,这可能才有意义。但是,基本上,你可以让一个班级StuffGetter
拥有自己的方法GetStuff
:
public class StuffGetter
{
public int GetStuff(int rawStuff)
{
return rawStuff + 1 // presumably, the real example is more complicated than this
}
}
然后,你会做这样的事情:
class CustomFS : FS
{
private StuffGetter _stuffGetter { get; set; }
public CustomFS(StuffGetter stuffGetter)
{
_stuffGetter = stuffGetter;
}
protected override int GetStuff(int x)
{
int retval = base.GetStuff(x);
return _stuffGetter.GetStuff(retval);
}
}
class CustomFS2 : FS2
{
private StuffGetter _stuffGetter { get; set; }
public CustomFS2(StuffGetter stuffGetter)
{
_stuffGetter = stuffGetter;
}
protected override int GetStuff(int x)
{
int retval = base.GetStuff(x);
return _stuffGetter.GetStuff(retval);
}
}
基本上,您将StuffGetter
实例传递给任何需要自定义GetStuff
实现的类。作为替代方案,您可以使StuffGetter
成为静态类(这将使您无需传入实例),但这不太灵活。例如,如果您想要两个不同的GetStuff
实现,具体取决于使用实例,您可以传入(并存储)包含所需实现的实例。
答案 2 :(得分:0)
class CustomFS : FS
{
protected override int GetStuff(int x)
{
return CustomHelper.GetStuff(base.GetStuff(x));
}
}
class CustomFS2 : FS2
{
protected override int GetStuff(int x)
{
return CustomHelper.GetStuff(base.GetStuff(x));
}
}
static class CustomHelper
{
static int GetStuff(int x)
{
return x + 1;
}
}