Я новичок в ООП. Недавно я прочитал о принципе замены Лискова.
В приведенном ниже коде Площадь класс наследует Give_Area. предполагать Площадь Класс имеет отношение к квадрату (например, проверка достоверности). Give_Area дает площадь квадрата (4 вершины по периметру круга) и площадь круга. Итак, если мне дают Радиус, Я должен напечатать область круга и квадрата (состоит из вершин, расположенных по периметру этого круга). Чтобы получить площадь круга, я использовал параметр. Но нет параметра при получении площади квадрата. Таким образом, я сделал перегрузку здесь.
#include<iostream>
#include<cmath>
using namespace std;
class Give_Area
{
public:
double Radius;
double Area(double pi)
{
return pi*Radius*Radius;
}
double Area()
{
double temp = sqrt(2.0)*Radius;
return temp*temp;
}
};
class Square : public Give_Area
{
public:
bool Validity()
{
//checking validity
}
};
int main()
{
Give_Area* area = new Square();
area->Radius = 3.0;
cout<< "Area of Circle: " << area->Area(3.14159) <<endl;
cout<< "Area of Square: " << area->Area() <<endl;
return 0;
}
Мой вопрос ..
Is this overloading violating Liskov Substitution Principle?
Если этот код нарушает, то кто-нибудь может привести пример перегрузки, которая не нарушит принцип подстановки Лискова?
Я погуглил свой запрос, но ничего не нашел. 🙁
Заранее спасибо.
Принцип замещения Лискова (или LSP) об абстракции. Представьте себе класс Shape
и два класса Square
а также Rectangle
вытекающий из Shape
, Сейчас Shape
имеет (виртуальный) метод getArea()
, Вы могли бы ожидать, что он вернет область, которая покрыта (конкретным, экземпляром!) Формой независимо от того, какого типа это на самом деле. Так что если вы позвоните getArea()
на Shape
пример, тебе все равно будь то прямоугольник, квадрат или любая другая форма, о которой вы могли подумать.
Без перегрузки даже не было бы необходимости в чем-то вроде LSP, то есть ответ — нет, перегрузка и LSP не противоречат.
С другой стороны, как указал Паксдиабло, применение LSP зависит от дизайна. С точки зрения приведенного выше примера это означает, может быть, по какой-то причине вы на самом деле делать заботиться о том, есть ли у вас прямоугольник или нет. Ну, в этом случае LSP говорит, что вы должны подумать о своем дизайне.
Я должен признать, что на данный момент я не совсем понимаю, к чему стремится ваш код. Есть класс Give_Area
который вычисляет площадь круга в зависимости от значения pi
, Второй метод вычисляет квадрат, который имеет Radius
как его диагональ? Тогда есть Square
учебный класс. Если Validity()
возвращает false, что бы это значило? Выродившийся квадрат может быть? Мои предложения: пересмотреть свой дизайн. Спросите себя «с какими классами и объектами я хочу иметь дело?» и «какие объекты реального мира я хочу сделать моделью?»
Как нарушать LSP демонстрируется в Википедии (ссылка выше). Я постараюсь сделать второй пример. Скажи, у тебя есть класс Car
с методом drive()
, Производные занятия (RacingCar
, Van
, …) можно указать скорость, ускорение и т. д. Когда автомобиль врезается в воду (глубокая вода, озеро, море), машина сломается и будет вызван следующий гараж. Теперь вы выводите класс AmphibiousVehicle
, Этот не ломается на воде, и гараж будет вызываться без пользы. Вы ожидали этого? Возможно. Но если нет, в зависимости от дальнейшего контекста я бы подумал о классе Vehicle
которая является основой Car
, Было бы метод move()
, А также drive()
который принадлежит еще Car
назвал бы move()
и может вызвать (снова ;-)) гараж в случае проблем. И так далее.