Các nguyên tắc cơ bản của OOP: Kế thừa
Khi xây dựng các dự án lớn và phức tạp, con người tìm cách làm cho quá trình này hiệu quả hơn. Một trong những cách phổ biến là tận dụng các phát triển hiện có. Ví dụ, việc phát triển một kế hoạch xây dựng sẽ dễ dàng hơn nhiều nếu không bắt đầu từ con số không mà dựa trên các bản thiết kế trước đó.
Việc tái sử dụng mã trong lập trình cũng rất phổ biến. Chúng ta đã biết một kỹ thuật như vậy: tách một đoạn mã thành một hàm và sau đó gọi nó từ các vị trí khác nhau nơi cần chức năng tương ứng. Nhưng OOP cung cấp một cơ chế mạnh mẽ hơn: khi phát triển một lớp mới, nó có thể kế thừa từ một lớp khác, tiếp nhận toàn bộ cấu trúc bên trong và giao diện bên ngoài, chỉ cần điều chỉnh tối thiểu để phù hợp với mục đích. Do đó, bắt đầu từ lớp cha, bạn có thể nhanh chóng "phát triển" một lớp dẫn xuất với các khả năng bổ sung hoặc được tinh chỉnh. Ngoài ra, bất kỳ thay đổi nào sau này đối với lớp cha (như cải tiến hoặc sửa lỗi) sẽ tự động ảnh hưởng đến tất cả các lớp con.
Khi một lớp là cha của một lớp khác, nó được gọi là lớp cơ sở. Ngược lại, lớp được kế thừa từ lớp cơ sở được gọi là lớp dẫn xuất.
Tất nhiên, chuỗi kế thừa (hay chính xác hơn là cây gia đình) có thể được tiếp tục: mỗi lớp có thể có nhiều lớp kế thừa, những lớp này lại có các lớp kế thừa của riêng chúng, và cứ thế. Điều duy nhất mà các quy tắc kế thừa không cho phép là các vòng lặp trong quan hệ họ hàng, ví dụ, một cháu trai không thể là cha của ông nội mình.
Mối quan hệ giữa bất kỳ lớp nào và hậu duệ của nó ở bất kỳ thế hệ nào được mô tả bằng cụm từ "là một", tức là hậu duệ có khả năng hoạt động như tổ tiên, nhưng không ngược lại. Điều này là do đối tượng dẫn xuất thực sự chứa mô hình dữ liệu của tổ tiên và bổ sung thêm các trường và hành vi mới.
Bằng cách kế thừa các lớp từ nhau, chúng ta có cơ hội xử lý các đối tượng liên quan theo cách thống nhất, vì một số chức năng của chúng là chung.
Ví dụ, một chương trình vẽ giả định có thể được sử dụng để triển khai nhiều loại hình dạng, bao gồm hình tròn, hình vuông, hình tam giác, v.v. Mỗi đối tượng có tọa độ trên màn hình (để đơn giản, chúng ta sẽ giả định rằng một cặp giá trị X và Y của tâm hình dạng được chỉ định). Ngoài ra, mỗi hình dạng được vẽ bằng màu nền, màu viền và độ dày viền riêng của nó.
Điều này có nghĩa là chúng ta có thể triển khai các hàm để đặt tọa độ và thiết lập kiểu vẽ chỉ một lần trong lớp cha mô tả hình dạng trừu tượng, và các hàm này sẽ tự động được kế thừa bởi tất cả các hậu duệ.
Hơn nữa, để đơn giản hóa mã nguồn, mong muốn là thống nhất không chỉ các cài đặt mà còn cả việc vẽ các hình dạng khác nhau. Câu này chứa một mâu thuẫn nào đó: vì các hình dạng khác nhau, và mỗi hình phải được hiển thị theo cách riêng của nó, vậy chúng ta đang nói về sự thống nhất nào? Chúng ta đang nói về một giao diện phần mềm thống nhất. Thật vậy, theo khái niệm trừu tượng hóa, cần phải tách giao diện bên ngoài khỏi triển khai bên trong. Và việc hiển thị các hình dạng cụ thể thực chất là một chi tiết triển khai.
Một giao diện thống nhất và các triển khai khác nhau cho các loại hình dạng dẫn chúng ta một cách tự nhiên đến khái niệm tiếp theo — đa hình.