“遗产”覆盖一个功能

时间:2009-12-11 19:25:20

标签: c# inheritance override

在某种程度上,这更像是一个思考练习,而不是一个真正的问题,因为我没有足够的CustomFS类来使用复制粘贴特别困扰。但我想知道是否有更好的方法。

假设我有几个类CustomFSCustomFS2等,所有这些类都继承自FSFS2等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;
    }
}

3 个答案:

答案 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;
    }
}