簡體   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