【发布时间】:2017-08-22 21:26:18
【问题描述】:
我正在尝试设计几个基本绘图类,我可以从中继承和定义复杂的绘图。
如您所见,LineDrawing 和 CompoundDrawing 派生自一个抽象的绘图类。 CompoundDrawing 有一个内部List<Drawing>,它允许我们存储任意数量的Drawing 对象并定义更复杂的图形。
public abstract class Drawing
{
public bool CanBeRotated
{
get;
set;
}
private float m_rotation;
public float Rotation
{
get
{
return m_rotation;
}
}
protected Drawing()
{
CanBeRotated = true;
}
public void Rotate(float degree)
{
if (CanBeRotated)
m_rotation = degree;
}
}
public sealed class LineDrawing : Drawing
{
private readonly Line m_line;
public Line Line
{
get
{
return m_line;
}
}
public LineDrawing(Line line)
{
m_line = line;
}
}
public class CompoundDrawing : Drawing
{
protected IList<Drawing> m_drawings;
protected CompoundDrawing(IList<Drawing> drawings)
{
m_drawings = new List<Drawing>(drawings);
}
}
假设我想定义一个派生自 CompoundDrawing 的 RectangleDrawing。
public class RectangleDrawing : CompoundDrawing
{
public RectangleDrawing(IList<LineDrawing> lineDrawings) : base(lineDrawings)
{
foreach(var line in lineDrawings)
{
line.CanBeRotated = false;
}
}
}
现在我在这里遇到了一个问题!显然,我不希望这个新类中的 LineDrawing 对象是可旋转的!但我不确定我应该在这个模式的哪个位置设置它!
【问题讨论】:
-
所以您不想旋转
RectangleDrawing或组合线段? -
@BradleyDotNET 线段!
-
我猜你只需要对
lineDrawings做一个foreach 并设置他们的CanBeRotated属性。或者改变你的继承模型,让每个类要么总是可旋转的,要么不能旋转。 -
那又怎样?你还在作曲。如果您的基本问题是“派生类可以接触基类成员”,那么答案是响亮的是。
-
您仍然需要旋转线条才能旋转矩形。如果您将该属性设置为
false,那么您需要在旋转矩形时再次将其临时重置为true。我认为你的整个设置太复杂了,它对你不利而不是帮助。
标签: c# inheritance design-patterns