Есть ли способ применить принцип подстановки Лискова в C , не нарушая принцип открытия или закрытия?

#c

#c

Вопрос:

У меня есть этот код, написанный на C . Однако, глядя на код, я знаю, что это нарушит принцип открытия или закрытия. Глядя на ответ Soft Eng StackExchange. Принцип часто понимается более широко (и расплывчато), что подклассы не должны «нарушать ожидания», что, безусловно, является хорошей концепцией дизайна, но не совсем то, что говорится в LSP.

 struct Shape {
    virtual xyz area() const = 0;
};
struct Rectangle : Shape {
    Rectangle(const xyz width, const xyz height) : width{width}, height{height} {}
    xyz get_width() const { return width; }
    xyz get_height() const { return height; }
    virtual void setW(const xyz width) { this->width = width; }
    virtual void setH(const uint32_t height) { this->height = height; }
    xyz area() const override { return width * height; }
private:
    xyz width, height;
};
struct Square : Shape {
    Square(xyz size) : sizes(size) {}
    void setS(const xyz size) { this->sizes = size; }
    xyz area() const override { return sizes * sizes; }
private:
    xyz sizes;
};
void process(Shape amp;s) { }
 

Комментарии:

1. можете ли вы объяснить, как LSP и Open Closed отличаются в вашем коде? Я действительно не понимаю, что ты имеешь в виду

2. Каким образом этот код будет нарушать OCP? Как это не применять LSP? Возможно, потребуется разделить общедоступный API и API, ориентированный на наследование, используя NVI .

3. Я не понимаю, как ваш код нарушает OCP, вы абстрагируетесь от того, как вычисляется область, чтобы она была открыта для любого расширения без необходимости каких-либо изменений. Я даже не понимаю, как это противоречит LSP: везде, где вы хотите использовать a Shape , вы можете использовать a Rectangle или a Square , поскольку их area реализация реализована правильно (и имеет конкретное значение).

4. это нарушило бы LSP, если Square наследует Rectangle (что является распространенным примером для демонстрации нарушения LSP) из-за функций setW и setH, но в вашем коде это не так….