[英]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.