В настоящее время я разрабатываю дизайн для простого графического редактора, который поддерживает тривиальные операции для двумерных и трехмерных фигур.
Дело в том, что я хочу сделать прототип этих фигур, как это делает MsPaint. И на данный момент это рендеринг, мне нужно где-то хранить пиксели от холста, которые покрываются прототипом, на тот случай, когда прототип меняется, чтобы восстановить свое состояние на холсте. Итак, я хочу, чтобы все мои фигуры поддерживали этот тип буферизации (Графическая операция является базовым классом для всех операций рендеринга):
public abstract class Shape: GraphicOperation {
protected List<SomePoint> backup;
public Shape(Color c): base(c) { }
public Color FigureColor {
get { return color; }
protected set { color = value; }
}
public abstract void renderPrototype(Bitmap canvasToDrawOn);
}
Основная идея заключается в том, что с точки зрения проектирования ОО было бы здорово обеспечить поддержку буфера на уровне базового класса (Shape), я имею в виду, что для классов TwoDShape и ThreeDShape этот список должен быть инициализирован по-разному - для TwoDShape с экземплярами TwoDPoint и для ThreeDShape с экземплярами ThreeDPoint.
Но для этого SomePoint должен быть базовым классом как для двумерных, так и для трехмерных классов точек. Допустимо ли с точки зрения ОО выводить оба этих класса из одного базового класса?
Возможно, здесь слишком много слов, но я просто хотел, чтобы проблема была понятна всем.
Edit : кстати, это хорошая идея, чтобы получить точечные классы от их короля форм? Лично я не вижу других вариантов, но, может быть, будет лучше, если я выведу это непосредственно из формы? Теперь это:
public abstract class TwoDShape : Shape {
protected List<SomePoint> backup;
public TwoDShape(Color c) : base(c) { }
}
public class TwoDPoint: TwoDShape {
//...
}
и то же самое для ThreeDPoint.