Tôi nghĩ sẽ thật tuyệt khi cả troll và người sói đều thừa hưởng thuộc tính của nó từ kẻ thù và ghi đè lên một số trong số chúng.
Thật không may, cách tiếp cận đa hình này, phổ biến trong những năm 90, đã cho thấy nó là một ý tưởng tồi trong thực tế. Hãy tưởng tượng bạn thêm 'sói' vào danh sách kẻ thù - tốt, nó chia sẻ một số thuộc tính với người sói, vì vậy bạn muốn hợp nhất chúng thành một lớp cơ sở chung, ví dụ. "Sói". Bây giờ bạn thêm 'Người' vào danh sách kẻ thù, nhưng người sói đôi khi là con người, vì vậy họ cũng chia sẻ các thuộc tính, chẳng hạn như đi bằng 2 chân, có thể nói chuyện, v.v. Bạn có tạo cơ sở chung 'Người hình người' cho người và người sói không và sau đó bạn có phải ngăn người sói xuất phát từ WolfLike không? Hay bạn nhân bội thừa kế từ cả hai - trong trường hợp nào, thuộc tính nào được ưu tiên khi một thứ gì đó trong Humanoid đụng độ với thứ gì đó trong WolfLike?
Vấn đề là việc cố gắng và mô hình hóa thế giới thực như một cây các lớp là không hiệu quả. Lấy 3 thứ bất kỳ và có lẽ bạn có thể tìm thấy 4 cách khác nhau để đưa yếu tố hành vi của họ vào chia sẻ và không chia sẻ. Đây là lý do tại sao nhiều người đã chuyển sang mô hình dựa trên mô-đun hoặc thành phần thay vào đó, trong đó một đối tượng bao gồm một số đối tượng nhỏ hơn tạo nên tổng thể và các đối tượng nhỏ hơn có thể được hoán đổi hoặc thay đổi để tạo nên hành vi bạn muốn. Ở đây bạn có thể chỉ có 1 lớp Enemy và nó chứa các đối tượng hoặc thành phần phụ để di chuyển (ví dụ: Bipedal so với Quadrupedal), các phương thức tấn công của nó (ví dụ: cắn, vuốt, vũ khí, nắm đấm), da của nó (màu xanh lá cây cho troll, lông cho người sói và sói), v.v.
Điều này vẫn hoàn toàn hướng đối tượng, nhưng khái niệm về một đối tượng hữu ích khác với những gì thường được dạy trong sách giáo khoa. Thay vì có một cây thừa kế lớn gồm nhiều lớp trừu tượng khác nhau và một số lớp cụ thể ở đầu cây, bạn thường chỉ có 1 lớp cụ thể đại diện cho một khái niệm trừu tượng (ví dụ: 'kẻ thù') nhưng chứa nhiều lớp cụ thể hơn đại diện cho các khái niệm trừu tượng hơn (ví dụ như các cuộc tấn công, loại da). Đôi khi các lớp thứ hai này có thể được triển khai tốt nhất thông qua 1 mức kế thừa (ví dụ: lớp Tấn công cơ sở và một số lớp dẫn xuất cho các cuộc tấn công cụ thể) nhưng cây thừa kế sâu đã biến mất.
Nhưng có lẽ các lớp học quá nặng để thực tế, tôi không biết ...
Trong hầu hết các ngôn ngữ hiện đại, các lớp học không 'nặng'. Chúng chỉ là một cách viết mã khác và chúng thường chỉ bao gồm cách tiếp cận theo thủ tục mà bạn sẽ viết bằng mọi cách, ngoại trừ với cú pháp dễ dàng hơn. Nhưng bằng mọi cách, đừng viết một lớp trong đó một hàm sẽ làm. Các lớp học về bản chất không tốt hơn, chỉ là nơi chúng làm cho mã dễ quản lý hoặc dễ hiểu hơn.