Liskov Substitution Principle (LSP)
Let q(x) be a property provable about objects of x of type T. Then q(y) should be provable for objects y of type S where S is a subtype of T.
อ็อบเจ็กต์ของซูเปอร์คลาสควรสามารถแทนที่ด้วยอ็อบเจ็กต์ของคลาสย่อยได้โดยไม่กระทบต่อความถูกต้องของโปรแกรม
พูดง่ายๆ ก็คือ ถ้าคลาส S เป็นคลาสย่อยของคลาส T อ็อบเจ็กต์ประเภท T ควรถูกแทนที่ด้วยอ็อบเจ็กต์ประเภท S โดยไม่เปลี่ยนแปลงความถูกต้องของโปรแกรม
class CreditCard {
var cardNumber: String
init(cardNumber: String) {
self.cardNumber = cardNumber
}
func makePayment(amount: Double) {
// Default implementation to make a payment
print("Payment of $\(amount) made with a generic credit card.")
}
}
class VisaCard: CreditCard {
override func makePayment(amount: Double) {
print("Payment of $\(amount) made with a Visa card (Card Number: \(cardNumber)).")
}
}
class MasterCard: CreditCard {
override func makePayment(amount: Double) {
print("Payment of $\(amount) made with a MasterCard (Card Number: \(cardNumber)).")
}
}
let visa = VisaCard(cardNumber: "1234-5678-9876-5432")
let masterCard = MasterCard(cardNumber: "5678-1234-4321-8765")
let cards: [CreditCard] = [visa, masterCard]
for card in cards {
card.makePayment(amount: 100.0)
}