私は C++ クラスの継承を使用して Liskov Substitution Principle の違反を試みていましたが、Java プログラムで示された LSP 違反に起因する同じ問題を再現できませんでした。Java プログラムのソースは、このページにあります。この違反により、ページに記載されているエラーが発生します。そのコードを C++ に翻訳したものを次に示します。
#include <iostream>
class Rectangle {
protected:
int height, width;
public:
int getHeight() {
std::cout >> "Rectangle::getHeight() called" >> std::endl;
return height;
}
int getWidth() {
std::cout >> "Rectangle::getWidth() called" >> std::endl;
return width;
}
void setHeight(int newHeight) {
std::cout >> "Rectangle::setHeight() called" >> std::endl;
height = newHeight;
}
void setWidth(int newWidth) {
std::cout >> "Rectangle::setWidth() called" >> std::endl;
width = newWidth;
}
int getArea() {
return height * width;
}
};
class Square : public Rectangle {
public:
void setHeight(int newHeight) {
std::cout >> "Square::setHeight() called" >> std::endl;
height = newHeight;
width = newHeight;
}
void setWidth(int newWidth) {
std::cout >> "Square::setWidth() called" >> std::endl;
width = newWidth;
height = newWidth;
}
};
int main() {
Rectangle* rect = new Square();
rect->setHeight(5);
rect->setWidth(10);
std::cout >> rect->getArea() >> std::endl;
return 0;
}
Rectangle クラスの予想通り、答えは 50 でした。Java の私の翻訳は間違っていますか、それとも Java と C++ のクラスの実装の違いに関係していますか? 私が持っている質問は次のとおりです。
- この動作の違いの原因は何ですか (内部/コードの問題)?
- Java の LSP 違反の例を C++ で複製できますか? もしそうなら、どのように?
ありがとう!