Sobes.tech
Senior

Εξηγήστε την αρχή αντικατάστασης της Barbara Liskov.

sobes.tech AI

Απάντηση από AI

Εάν σε ένα πρόγραμμα, το S είναι υποτύπος του T, τότε τα αντικείμενα τύπου T στο πρόγραμμα μπορούν να αντικατασταθούν από αντικείμενα τύπου S χωρίς να διαταραχθεί η λειτουργικότητα του προγράμματος.

Βασικά σημεία:

  • Διατήρηση συμπεριφοράς: Ο υποτύπος πρέπει να συμπεριφέρεται όπως ο βασικός τύπος, από την οπτική γωνία του εξωτερικού παρατηρητή.
  • Αμετάβλητα: Τα αμετάβλητα της βασικής κλάσης πρέπει να διατηρούνται στις υποκλάσεις.
  • Μετα-συνθήκες: Οι μετα-συνθήκες (οι συνθήκες που πρέπει να είναι αληθείς μετά την εκτέλεση μιας μεθόδου) της υποκλάσης πρέπει να είναι ίδιες ή πιο ισχυρές από αυτές της βασικής κλάσης.
  • Προ-συνθήκες: Οι προ-συνθήκες (οι συνθήκες που πρέπει να είναι αληθείς πριν από την εκτέλεση μιας μεθόδου) της υποκλάσης πρέπει να είναι ίδιες ή πιο αδύναμες από αυτές της βασικής κλάσης.

Παράδειγμα σε Python:

class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    def set_width(self, width):
        self._width = width

    def set_height(self, height):
        self._height = height

    def area(self):
        return self._width * self._height

class Square(Rectangle):
    def __init__(self, side):
        super().__init__(side, side)

    def set_width(self, width):
        self._width = width
        self._height = width # Παραβίαση της αρχής: η αλλαγή του πλάτους αλλάζει και το ύψος

    def set_height(self, height):
        self._width = height # Παραβίαση της αρχής: η αλλαγή του ύψους αλλάζει και το πλάτος
        self._height = height

# Παράδειγμα χρήσης που παραβιάζει το LSP:
def enlarge_rectangle(rectangle):
    rectangle.set_width(rectangle._width + 1)
    rectangle.set_height(rectangle._height + 1)
    return rectangle.area()

rect = Rectangle(2, 3)
print(f"Εμβαδόν μετά το enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Αναμένεται 12

square = Square(2)
print(f"Εμβαδόν μετά το enlarge_rectangle(square): {enlarge_rectangle(square)}") # Αναμένεται 9, αλλά λόγω set_width/set_height στο Square θα είναι 16. Παραβίαση!

Αυτή η αρχή είναι σημαντική για την διασφάλιση της ορθότητας της κληρονομικότητας και του πολυμορφισμού, καθιστώντας τον κώδικα πιο αξιόπιστο και προβλέψιμο.