Tại sao phải sử dụng lớp trừu tượng trong trong OOP?

Mọi người cho em hỏi tại sao lại phải dùng lớp trừu tượng cụ thể là trong java ạ. Em gg rồi mà vẫn khó hiểu quá ạ. Em xin cảm ơn ạ.
Chẳng hạn như này ạ:

public class Animal {

    public void move()

}
public class Dog extends Animal {

     public void move()

}
public class Cat extends Animal {
    
     public void move()
}

Như thế này thì nó dễ hơn khi mình phải abstract class Animal làm gì cho mất công ạ.

Abstract class ngăn chặn một ngày nào đó bạn sẽ Animal animal = new Animal() điều này vô lý vì trong tự nhiên có con dog, cat chứ không có con Animal. Và rất nhiều lý do khác nữa, mời bạn xem tiếp topic bên dưới :point_down:

8 Likes

Thích ví dụ về động vật à, rất hay.
Như kiểu phân lớp, ngành, chi, loài, phân họ.
Bạn không thể tạo một con “ngành” của Chordata hoặc con “phân họ” của Canis vì nó trừu tượng, bao gồm nhiều chi, loài,…
Vâng, Animal (Giới Animalia) nó trừu tượng. Khi nói đến động vật, bạn có biết nó chính xác là (con) gì không? Người, Mèo, Gấu, Thỏ,…?
Nó phải là một thực thể xác định, nhưng nếu nó chỉ bao gồm (tổng quát) thì nó là trừu tượng như thế đấy.
Mục đích lớp trừu tượng là tạo ra một khung có sẵn.

Hầu hết động vật có khả năng di chuyển một cách tự nhiên và độc lập.

Ví dụ như đoạn mã của bạn:
Tạo một khung có sẵn với chức năng di chuyển (move). Mỗi loài thuộc động vật sẽ có cách di chuyển riêng (cách di chuyển, số chân, tốc độ, tần số, …)

9 Likes

theo mình hiểu thì interface,abstract class có ý nghĩa trong việc thiết kế hệ thống theo hướng đối tượng, bạn sẽ hỏi vì sao các method abstract chỉ chứa hàm rỗng rồi sau này lại bắt tôi viết nội dung lại làm vậy chi cho mất công vậy, sao tôi ko cứ viết nội dung hàm cho từng class rồi gọi nó thôi >> ý nghĩa của cái method abstract nó nằm ở mặt thiết kế vì :
giả sử bạn viết 1 đống các lớp cho heo, mèo, gà … và bạn quan sát và đưa ra nhận định
Bọn này sao có nhiều đặc điểm chung quá vậy, thuộc tính : màu lông, kích thước, số lượng chân … và các hành vi : ăn, uống, đi lại >> từ đây bạn có thể phỏng đoán bọn này phải thuộc về 1 lớp gì đó ( cái này nó cũng giống như cách suy luận quy nạp của con người, khi nhìn nhận sự vật hiện tượng ngoài thực tế, mà cái lập trình oop này gốc nó cũng lấy cảm hứng từ việc giả lập lại quá trình tư duy trừu tượng của con người), vậy là bạn tạo ra 1 lớp động vật và xếp đám kia vào lớp này, vậy lợi ích gì ở đậy

  1. giúp cho chương trình nó được sắp xếp 1 cách có logic và có ý nghĩa >> dễ hiểu >> dễ bảo trì, sửa chữa, khi 1 đứa nào đó đọc vào thấy à đối tượng này là con heo và nó thuộc lớp động vật thì chắc chắn nó sẽ có những thuộc tính này hành vi này
  2. giúp tái sử dụng mã nguồn, những gì mà cha có thì con chắc chắn có nếu ko cần thay đổi thì lấy lại mà sài khỏi viết lại
  3. về mặt ý nghĩa vì các lớp heo,gà, mèo được xếp vào lớp động vật vậy nó sẽ bắt buộc phải có đủ mọi tính chất của lớp động vật, nhưng có 1 số hành vi của bọn này thay đổi trên từng con vì vậy tại lớp chung hành vi này sẽ không thể đc định nghĩa rõ ràng đc >> hành vi này sẽ bắt buộc phải được định nghĩa lại tại từng lớp con, ngoài ra đương nhiên sẽ cho phép tồn tại cả những hành vi mà hoàn toàn giống nhau trên tất cả các con vật trong lớp động vật đó, những hành vi này sẽ ko bắt buộc định nghĩa lại

như mình đã nói việc tạo ra các lớp trừu tượng, hàm trừu tượng nó có ý nghĩa về mặt thiết kế hệ thống, tạo ra các ràng buộc bắt buộc để hệ thống logic hơn, và sự ra đời của nó là dựa vào việc bạn phân tích bài toán đến đâu nhiều khi mới vào khách hàng đưa cho abc yêu cầu abc dữ liệu thì chưa thấy đc nguyên 1 hệ thống nhưng dần dần hệ thống to ra lúc đó tòi ra 1 đống đối tượng như nhau lúc đó mới bắt đầu refactor code, nên các dev có kinh nghiệm chinh chiến lâu năm hoặc kiến trúc sư hệ thống họ sẽ xây dựng lên cái khung trước sau này phình ra cũng đỡ phải refactor 1 đống, nói tóm lại mục tiêu nó hướng tới là giúp code dễ hiểu, dễ bảo trì, dễ mở rộng, còn mình đảm bảo viết theo hướng đối tượng sẽ phải viết code nhiều hơn với các kỹ thuật khác, đôi khi mình tự hỏi giữa việc viết 1 chương trình dễ hiểu và 1 chương trình gọn đến mức khó hiểu nhưng chạy nhanh thì người ta sẽ chọn kiểu nào :smiley:

5 Likes

Tại sao dùng abstract class ?

  • Để thống nhất các class có đặc điểm giống nhau nhưng cách vận hành khác nhau.
    Khi thống nhất được thì sẽ áp dụng được thuật toán ngắn gọn, đơn giản.
  • Để sử dụng lại mã trong khi kế thừa.

Tại sao abstract class không thể tạo đối tượng ?

  • Bởi các thông tin trong abstract class được thiết kế mức chung chung không cụ thể cho một lớp nào đó nên không xác định được nguyên tắc hoạt động của class. Nếu sinh ra đối tượng thì cũng không biết đối tượng đó là cái gì, hoạt động như thế nào.
6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?