30/09/2018, 18:42
OOP C++ Lớp trừu tượng
Tại sao phải tạo ra lớp trừu tượng ạ? Nếu chúng ta k tạo ra lớp trừu tượng chúng ta vẫn kế thừa được mà? Tạo lớp trừu tượng thì chúng ta k thể tạo đối tượng từ nó!!! Mn giải thích giúp mình với, mình cảm ơn
Bài liên quan
Nói theo 1 cách dễ hiểu mà mình tự đúc kết được thì lớp trừu tượng hay abstract class là 1 đối tượng mà khi hiện thực hóa (instantiate) thì nó không có ý nghĩa gì cả, nhưng bạn lại cần nó vì nó là sự tổng hợp của một số tính chất chung giữa các object khác với nhau.
Lấy ví vụ đơn giản, giả sử bạn có class chó và mèo, chó và mèo đều là động vật có vú, đều đi lại, ăn, uống, kiếm thức ăn, ngủ…Bạn cần code có thể reuse và gọn được nên bạn sẽ nghĩ tới việc 2 class này được kế thừa từ 1 class khác - class Động vật có vú đi hén
Động vật có vú thì có những đặc điểm của các con vật trên nhưng mà bạn không thể hiện thực hóa nó được! Làm gì có loài vật nào tên là động vật có vú? Chính vì thế nên bạn mới cần 1 abstract class.
Bạn nên google thêm từ khóa Interface.
Khuyến khích bạn nên đọc cuốn Beginning C++ for game development, nó ngắn, sơ lược nhưng mà rất dễ hiểu, trực quan :v hồi xưa mình cũng ko hiểu cho lắm
Như tên của nó : “trừu tượng”
Thường bạn có thể tạo ra một thứ gì đó dễ dàng, nhưng sau đó việc bảo trì, nâng cấp, … khá là khó khăn vì các đối tượng lúc này rời rạc
Khi bạn kế thừa lại một class thì bạn có thể giảm bớt thời gian viết lại một số method, nhưng khi kế thừa một abstract class, bạn phải định nghĩa lại các method -> abstract class tạo ra một cái mẫu để bất cứ class nào kế thừa từ nó đều phải có các phương thức trên
Vd ta có class Animal là một abstract class, có method move. Nhưng move như thế nào thì bạn không biết được vì mỗi loài khác nhau, nhưng bạn biết chắc chắn nó sẽ có phương thức move
=> Có thể áp dụng các design pattern
mình còn câu hỏi này nữa nè!! giúp mình với, mình cảm ơn
Mình nghĩ đó là lý do tại sao lại có Abstract Class, có AC để bạn không bị các lỗi mà mình ko handle được. Ví dụ như trường hợp DongVat, thì nếu lớp con “lỡ” gọi hàm DiChuyen mà chưa định nghĩa thì compile nó sẽ réo lên, và dev sẽ định nghĩa cho nó. Còn như trường hợp dưới thì compile cứ dịch, cứ chạy, đến khi bug thì dev không biết đường nào mà lần.
Vì ở đây bạn viết hết nên bạn sẽ biết bug ở đâu, nhưng trong project nhiều người làm thì nhà ai lo việc nhà nấy, bug rất khó để report.
Cảm ơn các bạn rất nhiều :3