[英]How to override parts of a method of a base class in C#
我有從Class A
Class B
派生的Class B
Class A
。
如何覆蓋Class A
中Draw
方法的一部分,並保留其中的一部分並丟棄其余部分?
例如,在這里我希望Class B
的Draw
方法為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
}
}
那為什么不只調用要執行的方法呢?
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.