Найти - Пользователи
Полная версия: Не нарушил ли я принцип подстановки Лисков?
Начало » Python для новичков » Не нарушил ли я принцип подстановки Лисков?
1
zlodiak
подскажите пожалуйста полностью ли соответствует нижеприведённый код принципу подстановки Барбары Лисков?

 class PizzaStorage:
    def __init__(self):
        self.count = 10
    def minus(self, count):
        self.count = self.count - count
class Customer:
    def __init__(self, name, storage):
        self.name = name
        self.storage = storage
    def eat(self):
        self.storage.minus(1)
class FatCustomer(Customer):
    def __init__(self, name, storage, logger):
        super().__init__(name, storage)
        self.logger = logger
    def eat(self):
        self.storage.minus(1)
        self.logger.write_to_log('fat eat')
    def sayThanks(self):
        print('thanks!')
class Logger:
    def write_to_log(self, text):
        print('LOG: ', text)
pizzaStorage = PizzaStorage()
customer = Customer('bill', pizzaStorage)
fatCustomer = FatCustomer('bob', pizzaStorage,  Logger())
customer.eat()
print(pizzaStorage.count)
fatCustomer.eat()
print(pizzaStorage.count)

как видите, я унаследовал FatCustomer от Customer. Эти два экземпляра класса имеют почти одинаковый метод eat(). Этот метод в обоих случаях делает необходимое действие(удаление пиццы из хранилища). НО один из этих методов совершает дополнительное действие - пишет в лог.

с одной стороны принцип Лисков не нарушается, потому что оба объекта могут одинаково успешно удалить пиццу. но с другой стороны принцип лисков нарушается, потому что, методы eat() не полностью иденитчны
FishHook
zlodiak
Старайтесь не наследовать неабстрактные типы и тогда все будет хорошо LSP
Rodegast
Всё норм, только в методе eat класса FatCustomer должно быть Customer.eat(self) в место self.storage.minus(1)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB