我Class B
来自Class A
。
如何覆盖Draw
中Class 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}}
答案 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; }}
}