Я делаю дизайн рамки OO, и я столкнулся со следующей проблемой.Объектно-ориентированная проблема дизайна, Лисков Замена Принцип
Допустим, что в рамках меня есть интерфейса с Shape и пользователи могут свободно осуществлять и расширяют (добавление новых функций) Shape интерфейса для создания собственных фигур, например, Площадь и Круг. Чтобы эти новые объекты были доступны, пользователи должны зарегистрировать их в ShapeFactory, определяя имя формы (строки) и объекта.
Кроме того, каркас обеспечивает интерфейс, который называется ShapeWorker, который определяет следующую функцию:
class ShapeWorker
{
public:
void processShape(Shape& shape) = 0;
};
Пользователи свободны Для реализации ShapeWorker интерфейса, чтобы сделать конкретный работник формы, например, SquareWorker и CircleWorker. Чтобы эти новые объекты были доступны, пользователи должны зарегистрировать их в WorkerFactory, указав имя формы (строки) и объекта.
В определенный момент, рамки, учитывая строка, представляющая имя фигуры, создает новый Shape, используя ShapeFactory, а потом (где-то в коде) создает новый ShapeWorker, используя WorkerFactory с таким же именем. Затем вызывается processShape с предоставлением созданного ранее экземпляра Shape.
[ ... ]
Shape* myShape = shapeFactory.create(shapeName);
[ ... ]
ShapeWorker* myWorker = workerFactory.create(shapeName);
myWorker->processShape(*myShape);
[ ... ]
Дело в том, что, делая это, я заставить пользователя реализующий, например, SquareWorker сделать авансовый бросок от Форма на площади в функции processShape так, чтобы доступ к интерфейсу полных Square «ы:
class SquareWorker
{
public:
void processShape(Shape& shape)
{
Square& square = dynamic_cast< Square& >(shape);
// using Square interface
}
};
Это противоречит принципу замещения Лиск.
Теперь, этот подход неправильный? Что это было бы лучшим решением? Обратите внимание, что я не хочу реализовать processShape как функцию Shape.
Надеюсь, описание было достаточно ясным.
Заранее за вашу помощь.
Симо
Вы должны добавить тег C++, я думаю. –
Можете ли вы дать обоснование заявления «Обратите внимание, что я не хочу реализовывать функцию processShape как функцию члена Shape»? – SCFrench
Одна из проблем заключается в том, что код со ссылками на Shape и ShapeWorker не имеет понятия, безопасно ли передавать Shape в ShapeWorker без какой-либо прослеживаемости обратно к точке создания, чтобы убедиться, что оба объекта были созданы с использованием того же shapeName. – SCFrench