Hiểu Liskov Substitution Principle qua ví dụ !

Tram Ho

Liskov Substitution Principle là gì ?

  • The principle defines that objects of a superclass shall be replaceable with objects of its subclasses without breaking the application.
  • Nguyên tắc đóng mở xác đinh rằng các instance của lớp con có thể thay thế được instance lớp cha mà vẫn đảm bảo tính đúng đắn của chương trình.

Lấy ví dụ thực tế ?

Chúng ta cần tính tổng các số nguyên trong một mảng. “Hiện đại” hơn một chút chúng ta cần tính tổng của các số chẵn trong màng này chẳng hạn.
Hmmm !. Khởi tạo project thôi !

Trước hết là khởi tạo 2 class.
Class SumCalculator

  • Method Calculate() để tính tổng các số trong mảng.
    Class EvenNumbersSumCalculator kế thừa class SumCalculator
  • Method Calculate() để tính tổng các số chẵn trong mảng (note : Từ khóa new được sử dụng ở đây để chỉ ra rằng người lập trình đang tạo ra một phiên bản mới cho phương thức này bên trong lớp con).

  • Bây giờ thì test 2 hàm này thôi :

  • Kết quả của chương trình sẽ là :

  • Ơ thế này là ổn rồi còn gì =)). Nhưng chúng ta biết rằng một object thuộc kiểu con có thể gán cho biến thuộc kiểu cha, tức là kiểu cơ sở có thể dùng để thay thế cho kiểu dẫn xuất (tìm hiểu tính đa hình).
    Trong ví dụ này thì chúng ta có thể lưu EvenNumbersSumCalculator dưới dạng biến SumCalculator

  • Bây giờ 2 class ban đầu sẽ sửa một chút

  • Test thử lại hàm tính tổng số chẵn xem sao

  • Kết quả của chương trình sẽ là :

  • Như chúng ta có thể thấy, chúng ta không nhận được kết quả như mong đợi vì biến evenSum của chúng ta thuộc loại SumCalculator, là một lớp bậc cao hơn (lớp cơ sở).
    Điều này có nghĩa là phương thức Sum từ SumCalculator sẽ được thực thi.
    Vì vậy, điều này rõ ràng là không đúng, bởi vì lớp con của chúng ta không hoạt động như một lớp thay thế cho lớp cha(không đúng với Liskov Substitution Principle) .

Bây giờ là lúc áp dụng Liskov Substitution Principle

  • Lúc này 2 class ban đầu sẽ trở thành.

  • Hàm main

  • Kết quả chương trình
  • Kết quả của chương trình sẽ là :

  • Uầyyy. Chúng ta sẽ có kết quả tương tự** 40 & 18. Nhưng quan trọng là chúng ta có thể lưu trữ bất kỳ tham chiếu lớp con nào vào một biến lớp cơ sở và hành vi sẽ không thay đổi, đó là mục tiêu của Liskov Substitution Principle
Chia sẻ bài viết ngay

Nguồn bài viết : Viblo