SOLID Лисков Принцип замещения - PullRequest
2 голосов
/ 05 октября 2009

Если у меня есть что-то вроде

class square : figure {}

class triangle : figure {}

Значит ли это, что я никогда не должен использовать классы квадрата и треугольника, а только ссылаться на рисунок?

Как никогда, не делай так:

var x = new square();

Ответы [ 2 ]

6 голосов
/ 05 октября 2009

В вашем случае LSP будет означать, что все поведение, унаследованное от figure, должно соответствовать square или triangle. Таким образом, вы не хотели бы иметь сеттеры для figure.Side1, Side2 и Side3, потому что они не имеют смысла для square.

В какой-то момент вам придется ссылаться на square или triangle, но только в тех случаях, когда то, что вы делаете, относится к подклассу. Если вы реализуете поведение, которое будет одинаково хорошо применяться для всех фигур (возможно, метод Draw), тогда он должен принять параметр figure вместо square или triangle.

Например, ваши классы могут быть настроены следующим образом:

abstract class figure
{
    abstract void draw();
}

class triangle : figure
{
    void draw()
    {
        // ...
    }
}

class drawer
{
    void call_draw(figure fig)
    {
        fig.draw();
    }
}

Пока figure.draw() является виртуальным, то есть его реализация может (или должна) быть переопределена подклассом, вы можете выполнить triangle поведение *1021*, даже если объект используется как figure .

2 голосов
/ 07 октября 2009

Вы должны определить классы square и triangle и реализовать их методы - и вы должны иметь возможность создавать их, как вы указали:

var x = new square();

Большинство, если не все другие применения square и triangle должны быть через базовый класс figure.

Что касается LSP , это относится к другим методам в других классах, которые принимают figure в качестве параметра:

other_method(figure fig);

Этот метод должен быть доволен работой, независимо от того, передается ли ему экземпляр square или triangle, и ему не нужно пытаться обнаружить фактический класс для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...