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. Παραβίαση!
Αυτή η αρχή είναι σημαντική για την διασφάλιση της ορθότητας της κληρονομικότητας και του πολυμορφισμού, καθιστώντας τον κώδικα πιο αξιόπιστο και προβλέψιμο.