Принципы в C# - часть 4. Принцип подстановки Лискова

  • Михаил
  • 12 мин. на прочтение
  • 90
  • 19 Dec 2018
  • 19 Dec 2018

Принцип замещения Лисков, созданный Барбарой Лисков и Жаннет Винг, гласит:

Вы должны иметь возможность использовать любой производный класс вместо родительского класса и вести себя таким же образом без изменений.

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

static void Main()
{
    Apple orange = new Orange();
    Console.WriteLine(orange.GetColor());
    // outputs: "Orange";
}

public class Apple
{
    public string GetColor() => "Red";
}

public class Orange
{
    public string GetColor() => "Orange";
}

 

Давайте реализуем принцип подстановки Лисков:
 

static void Main()
{
    Fruit orange = new Orange();
    Console.WriteLine(orange.GetColor());
    // outputs: "Orange"
    Fruit apple = new Apple();
    Console.WriteLine(apple.GetColor());
    // outputs: "Red"
    Orange fruit = new Apple();
    Console.WriteLine(fruit.GetColor());
    // outputs: "Red"
}

public abstract class Fruit
{
    public abstract string GetColor();
}

public class Apple: Fruit
{
    public override string GetColor() => "Red";
}

public class Orange: Fruit
{
    public override string GetColor() => "Orange";
}

 

Здесь замена Лискова удовлетворяется нашим кодом. Приложение не нужно изменять для поддержки нового Fruit, поскольку подтипы (Apple и Orange), которые унаследованы от типа Fruit, могут быть заменены друг другом без возникновения ошибок.