繁体   English   中英

如何在C#中重写基类的方法的某些部分

[英]How to override parts of a method of a base class in C#

我有从Class A Class B派生的Class B Class A

如何覆盖Class ADraw方法的一部分,并保留其中的一部分并丢弃其余部分?

例如,在这里我希望Class BDraw方法为DrawRectangles() ,而不是DrawrCirclesDrawTriangles

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

那为什么不只调用要执行的方法呢?

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

方法没有部分覆盖。可以声明部分方法,但它们并不相同。如果要覆盖,则需要覆盖整个方法。

我建议您使用以下内容:

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();

作为替代设计,如果您需要绘制许多不同的“零件”,而没有太多替代图纸,我个人将使用[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; }}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM