30/09/2018, 17:31

Điểm khác nhau giữa Class, Abstract Class và Interface. Class nội là gì?

  1. Mình có xem một số bài hướng dẫn về Class, Abstract Class và Interface nhưng nó vẫn khá trừu tượng và mình không hiểu cho lắm. Mọi người có thể cho mình biết điểm khác nhau cơ bản giữa chúng và khi nào dùng loại nào không ?
  2. Khi mình tìm hiểu thì có 1 khái niệm là class nội (inner class), các bạn cho mình hỏi class nội dùng để làm gì ? Và ứng dụng của nó ? Cảm ơn các bạn nhiều
Itachi Citus viết 19:45 ngày 30/09/2018

Mục đích của hướng đối tượng là nhằm tổ chức mã nguồn tốt hơn, mã nguồn có khả năng tái sử dụng và làm cho lập trình giống như việc tổ chức quản các đối tượng trên thế giới thưc. Người ta “đẻ” ra cái khái niệm về Class, abstract class, interface, inner class nhằm phục vụ cho mục đích này.

Lấy ví dụ cổ điển
##Abstract class
Giả sử bạn có hai lớp là ConNguoi và ConCho, có một thuộc tính là viTri. Cả hai lớp này đều có một hàm thaydoiViTri, nhận vào một tọa độ và cập nhật tọa độ mới cho hai đối tượng thuộc hai lớp này. Như vậy bạn phải viết hai đoạn mã nguồn giống nhau cho hai lớp khác nhau.

Vậy có cách nào tái sử dụng đoạn mã nguồn này không? Bạn có thể tạo một lớp cha của hai lớp này là lớp DongVat, cài đặt phương thức thaydoiViTri. Nhưng điều này sẽ gây ra vấn đề khi có một người khác sử dụng thư viện do bạn viết ra, người ta có thể tạo một đối tượng của lớp ĐộngVật mà thực tế, đối tượng đó không có ý nghĩa và sẽ làm sai hoạt động của thư viện bạn viết ra.

Lúc đó người ta nghĩ ra khái niệm abstract class, là một lớp nhưng không thể tạo ra thực thể. Về mặt kỹ thuật, abstract class có thể chứa hoặc không chứa phương thức abstract - một phương thức chỉ có khai báo mà không chứa cài đặt.

##Interface
Ở C++, không tồn tại khái niệm interface về mặt kỹ thuật, nhưng ở java lại có, nguyên nhân thì tạm thời bỏ qua nhưng bạn có thể tìm hiểu để hiểu rõ hơn về interface. Interface nó giống như một hợp đồng, nói rằng những lớp nào implement interface này phải thực hiện dược những hàm được khai báo trong interface đó.

Lấy tiếp ví dụ ở trên. Giả sử ở đâu đó bạn có một hàm thay đổi vị trí cho một object. Bạn có thể viết hàm thay đổi vị trí cho Người, cho Động Vật, cho Con Chó, nhưng giả sử có thêm một lớp nữa là lớp Xe thì sao? Có cách nào để biết một đối tượng bất kỳ có thể di chuyển được không? Khi đó, bạn có thể tạo một interface tên là Movable, và yêu cầu bất kỳ lớp nào implement phương thức này đều phải cài đặt một phương thức là thaydoiViTri.

##Inner class
Inner Class, là một lớp bạn chỉ sử dụng bên trong một lớp/ một phương thưc/ một đoạn chương trình, mục tiêu chính là làm cho việc tổ chức mã nguồn rõ ràng hơn. Inner class có rất nhiều loại, thông thường inner class được dùng để xử lý sự kiện, viết xử lý cho multithread job v.v… Mình mới chỉ xài những cái đó, còn ứng dụng khác thì mình không rõ lắm.

TTmagic viết 19:43 ngày 30/09/2018

mình vừa tìm thấy cái này ở stack overflow khá hay

stackoverflow.com
Sarfraz

What is the difference between an interface and abstract class?

oop, interface, abstract-class
asked by Sarfraz on 08:15AM - 16 Dec 09

hong duc viết 19:33 ngày 30/09/2018

Abstract Class trong ứng dụng nhất là trong Design Pattern được dùng để tách biệt phần hay thay đổi với phần không thay đổi (phần chung) giữa các lớp khác để dễ dàng maintain và reuse code

Interface thì mình cũng biết sơ qua thôi, nó được dùng như là công cụ thay đổi hành vi thông qua Polymorphism (đa hình) giống như bạn Itachi_Citus đã nói, giả sử bạn tạo ra 1 phương thức để thể hiện sự di chuyển của đối tượng (tên là Move) với tham số vào là đối tượng đi, bạn sẽ phải ghi 1 đống phương thức Move để có thể nhận đối tượng lớp Người,Động Vật,Chó, sau đó bạn nảy ra ý tưởng mới thêm thằng lớp Xe vào chương trình thế là bạn phải mở code ra lại và ghi phương thức Move cho lớp Xe. Thật mệt phải không, đây là lúc Interface được đưa vào để giảm thiểu sự dư thừa đó, bạn chỉ cần cho các lớp trên (Người,Xe,Động Vật,Chó…v.v.) implement 1 interface bạn tạo ra giả sử là Movable như bạn Itachi đã nói, thì khi đó bạn chỉ cần cho phương thức Move nhận 1 tham số là đối tượng của lớp Implement Movable và sau đó để sự đa hình làm việc của nó

Inner Class được sử dụng nhiều nhất là trong Action Event khi nào bạn học đến GUI và Swing thì bạn sẽ hiểu

Muốn biết rõ thêm thì mình khuyên bạn đọc Head First Design Pattern nó sẽ nói rõ chi tiết những tình huống mà bạn có thể áp dụng mấy cái này 1 cách tốt nhất

Bài liên quan
0