如何在C#中覆盖基类方法的一部分

时间:2014-05-07 12:18:55

标签: c# inheritance

Class B来自Class A

如何覆盖DrawClass A方法的部分内容并保留部分内容并丢弃其余内容?

例如,我希望Draw中的Class B方法DrawRectangles()改为DrawrCircles,而不是DrawTriangles改为public class A { public virtual void Draw() { DrawRectangles(); DrawCircles(); } } public class B : A { public override void Draw() { // I want to still draw rectangles // but I do not want to draw circles // I want to draw triangles instead } }

{{1}}

3 个答案:

答案 0 :(得分:2)

那你为什么不直接调用你想要执行的方法?

public override void Draw()
{
     DrawRectangles();
     DrawTriangles();
}

方法没有部分重写。您可以声明partial methods但它们不一样。如果要覆盖,则需要覆盖整个方法。

答案 1 :(得分:1)

我建议你使用以下内容:

public class A
{
    public virtual void OverridableDraw()
    {
        DrawCircles();  // declare all those which can be overrided here
    }
    public void Draw()
    {
        DrawRectangles(); // declare methods, which will not change
    }
}
public class B : A
{
    public override void OverridableDraw()
    {
        // just override here
    }
}

理念是只覆盖那些往往会改变的东西。

然后,您可以调用这两种方法。

OverridableDraw();
Draw();

答案 2 :(得分:1)

作为替代设计,如果你有很多不同的部分,那么你必须画画,而没有那么多的替代画,我个人使用[Flag]枚举

[Flags]
public enum DrawParts
{
    Rectangles = 1,
    Circles = 2,
    Triangles = 4,
    //etc
}
public class A
{
    //or a regular get/setter instead of a virtual property
    public virtual DrawParts DrawMode { get { return DrawParts.Rectangles | DrawParts.Circles; } } 
    public void Draw()
    {
        var mode = DrawMode;
        if (mode.HasFlag(DrawParts.Circles))
            DrawCircles();
        if (mode.HasFlag(DrawParts.Rectangles)) //NB, not elseif
            DrawRectangles();
        //etc
    }

}

public class B : A
{
    public override DrawParts DrawMode{get{return DrawParts.Rectangles | DrawParts.Triangles; }}
}