Ghi Đè, Lớp Trừu Tượng và Giao Diện trong Lập Trình Hướng Đối Tượng

Chuyên khảo phân tích Oop bai07vi, đánh giá các khía cạnh quan trọng, đề xuất hướng nghiên cứu tiếp theo., phục vụ nghiên cứu và ứng dụng thực tiễn

Trường đại học

Trường Đại Học Công Nghệ

Người đăng

Ẩn danh

Thể loại

Bài Giảng

2020

52
1
0

Phí lưu trữ

30 Point

Mục lục chi tiết

1. Lớp trừu tượng

1.1. Lớp trừu tượng

1.2. Định nghĩa lại hay ghi đè

1.3. Ví dụ

1.4. Sử dụng từ khóa super

1.5. Quy định trong ghi đè

1.6. Hạn chế ghi đè

1.7. Bài tập 1

1.8. Bài tập 2

1.9. Lớp trừu tượng Abstract class

1.10. Phương thức trừu tượng

1.11. Cú pháp

1.12. Ví dụ 1

1.13. Lớp trừu tượng

1.14. Kết hợp KHÔNG hợp lệ và Kết hợp hợp lệ

1.15. Ví dụ 2

1.16. Biểu diễn trong UML

1.17. Bài tập 3

2. Giao diện Interface

2.1. Đa kế thừa và đơn kế thừa

2.2. Vấn đề gặp phải trong đa kế thừa

2.3. Giao diện

2.4. Lớp thực thi giao diện

2.5. Interface 2DShape 3DShape Drawable

2.6. Ví dụ

2.7. Giao diện

2.8. Giao diện

2.9. Ví dụ Java 8 Interface – default methods

2.10. Lớp trừu tượng vs. Giao diện

2.11. Lớp trừu tượng & Giao diện

2.12. Bài tập 4

Tóm tắt

I. Tổng quan về Ghi Đè Lớp Trừu Tượng và Giao Diện trong Lập Trình Hướng Đối Tượng

Ghi đè, lớp trừu tượng và giao diện là những khái niệm cốt lõi trong lập trình hướng đối tượng. Chúng giúp tổ chức mã nguồn một cách hiệu quả, tăng tính tái sử dụng và dễ bảo trì. Ghi đè cho phép lớp con thay thế hoặc làm rõ các phương thức của lớp cha, trong khi lớp trừu tượng định nghĩa các phương thức mà lớp con phải cài đặt. Giao diện cung cấp một cách để các lớp thực thi các hành vi mà không cần kế thừa từ một lớp cụ thể.

1.1. Khái niệm về Ghi Đè trong Lập Trình Hướng Đối Tượng

Ghi đè là quá trình mà một lớp con định nghĩa lại một phương thức đã được định nghĩa trong lớp cha. Điều này cho phép lớp con cung cấp một cài đặt cụ thể cho phương thức đó, phù hợp với nhu cầu của nó.

1.2. Lớp Trừu Tượng và Vai Trò của Nó

Lớp trừu tượng là lớp không thể được khởi tạo trực tiếp. Nó thường chứa các phương thức trừu tượng mà các lớp con phải cài đặt. Điều này giúp định nghĩa các khái niệm chung mà các lớp cụ thể có thể mở rộng.

II. Vấn đề và Thách thức trong Ghi Đè và Lớp Trừu Tượng

Mặc dù ghi đè và lớp trừu tượng mang lại nhiều lợi ích, nhưng cũng có những thách thức cần phải đối mặt. Việc ghi đè không đúng cách có thể dẫn đến sự nhầm lẫn trong mã nguồn, trong khi lớp trừu tượng có thể gây khó khăn trong việc cài đặt nếu không được thiết kế hợp lý.

2.1. Những Vấn Đề Thường Gặp Khi Ghi Đè

Một trong những vấn đề phổ biến là việc không tuân thủ quy tắc ghi đè, như không có cùng kiểu trả về hoặc danh sách tham số. Điều này có thể dẫn đến lỗi biên dịch hoặc hành vi không mong muốn.

2.2. Thách Thức Khi Sử Dụng Lớp Trừu Tượng

Lớp trừu tượng có thể gây khó khăn trong việc cài đặt nếu không có hướng dẫn rõ ràng. Các lập trình viên cần phải hiểu rõ cách thức hoạt động của lớp trừu tượng để tránh những sai sót trong quá trình phát triển.

III. Phương Pháp Ghi Đè và Cài Đặt Lớp Trừu Tượng

Để ghi đè một phương thức, lớp con cần phải có cùng tên và danh sách tham số với phương thức trong lớp cha. Đối với lớp trừu tượng, các lớp con phải cài đặt tất cả các phương thức trừu tượng được định nghĩa trong lớp cha.

3.1. Cú Pháp Ghi Đè Phương Thức

Cú pháp ghi đè yêu cầu phương thức trong lớp con phải trùng tên và danh sách tham số với phương thức trong lớp cha. Điều này đảm bảo rằng phương thức mới sẽ được gọi khi đối tượng của lớp con được sử dụng.

3.2. Cài Đặt Phương Thức Trừu Tượng

Các lớp con phải cài đặt tất cả các phương thức trừu tượng của lớp cha. Điều này đảm bảo rằng lớp con có thể hoạt động độc lập và thực hiện các hành vi cần thiết.

IV. Giao Diện và Ứng Dụng của Nó trong Lập Trình Hướng Đối Tượng

Giao diện là một công cụ mạnh mẽ trong lập trình hướng đối tượng, cho phép các lớp thực thi các phương thức mà không cần kế thừa từ một lớp cụ thể. Điều này giúp giảm thiểu sự phức tạp và tăng tính linh hoạt trong thiết kế phần mềm.

4.1. Định Nghĩa và Cấu Trúc của Giao Diện

Giao diện được định nghĩa bằng từ khóa 'interface' và chỉ chứa các chữ ký phương thức. Các lớp thực thi giao diện phải cài đặt tất cả các phương thức trong giao diện đó.

4.2. Lợi Ích của Giao Diện trong Thiết Kế Phần Mềm

Giao diện giúp tách biệt giữa định nghĩa và cài đặt, cho phép các nhóm phát triển phần mềm làm việc độc lập mà không cần biết chi tiết về cách thức cài đặt của nhau.

V. Kết Luận và Tương Lai của Ghi Đè Lớp Trừu Tượng và Giao Diện

Ghi đè, lớp trừu tượng và giao diện là những khái niệm quan trọng trong lập trình hướng đối tượng. Chúng không chỉ giúp tổ chức mã nguồn mà còn tạo ra các ứng dụng linh hoạt và dễ bảo trì. Tương lai của lập trình hướng đối tượng sẽ tiếp tục phát triển với những cải tiến trong cách thức sử dụng các khái niệm này.

5.1. Xu Hướng Phát Triển Trong Lập Trình Hướng Đối Tượng

Các xu hướng mới trong lập trình hướng đối tượng đang tập trung vào việc cải thiện khả năng tái sử dụng mã nguồn và giảm thiểu sự phức tạp trong thiết kế phần mềm.

5.2. Tương Lai của Giao Diện và Lớp Trừu Tượng

Giao diện và lớp trừu tượng sẽ tiếp tục đóng vai trò quan trọng trong việc phát triển các ứng dụng phức tạp, giúp các lập trình viên dễ dàng quản lý và mở rộng mã nguồn.

27/07/2025

Trích đoạn nội dung tài liệu

Bài 7 Ghi đè, lớp trừu tượng & giao diện Trịnh Thành Trung trungtt@soict.vn Nội dung 1. Lớp trừu tượng 3. Giao diện 1 Ghi đè Override Mối quan hệ kế thừa • Lớp con − Là một loại (is-a-kind-of) của lớp cha − Kế thừa các thành phần dữ liệu và các hành vi của lớp cha − Chi tiết hóa cho phù hợp với mục đích sử dụng mới + Extension: Thêm các thuộc tính/hành vi mới + Redefinition (Method Overriding): Chỉnh sửa lại các hành vi kế thừa từ lớp cha 4 Định nghĩa lại hay ghi đè • Phương thức ghi đè sẽ thay thế hoặc làm rõ hơn cho phương thức cùng tên trong lớp cha • Đối tượng của lớp con sẽ hoạt động với phương thức mới phù hợp với nó 5 Định nghĩa lại hay ghi đè • Cú pháp: Phương thức ở lớp con hoàn toàn giống về chữ ký với phương thức ở lớp cha − Trùng tên & danh sách tham số − Mục đích: Để thể hiện cùng bản chất công việc 6 Ví dụ class Shape { protected String name; Shape(String n) { name = n; } public String getName() { return name; } public float calculateArea() { return 0.0f; } } class Circle extends Shape { private int radius; Circle(String n, int r){ super(n); radius = r; } public float calculateArea() { float area = (float)(3.14 * radius * radius); return area; } } Lớp Square class Square extends Shape { private int side; Square(String n, int s) { super(n); side = s; } public float calculateArea() { float area = (float) side * side; return area; } } Viết lớp Triangle Sử dụng từ khóa super • Tái sử dụng các đoạn mã của lớp cha trong lớp con • Gọi phương thức khởi tạo super(danh sách tham số); − Bắt buộc nếu lớp cha không có phương thức khởi tạo mặc định • Gọi các phương thức của lớp cha super.tênPt(danh sách tham số); 11 Ví dụ package abc; public class Person { protected String name; protected int age; public String getDetail() { String s = name + "," + age; return s; } } import abc.Person; public class Employee extends Person { double salary; public String getDetail() { String s = super.getDetail() + "," + salary; return s; } } Quy định trong ghi đè • Phương thức ghi đè trong lớp con phải − Có danh sách tham số giống hệt phương thức kế thừa trong lớp cha. − Có cùng kiểu trả về với phương thức kế thừa trong lớp cha • Các chỉ định truy cập không giới hạn chặt hơn phương thức trong lớp cha − Ví dụ, nếu ghi đè một phương thức protected, thì phương thức mới có thể là protected hoặc public, mà không được là private.

13 Ví dụ class Parent { public void doSomething() {} protected int doSomething2() { return 0; } Không ghi đè được do không } cùng kiểu trả về class Child extends Parent { protected void doSomething() {} protected void doSomething2() {} } Không ghi đè được do chỉ định truy cập yếu hơn (public -> protected) Quy định trong ghi đè (tiếp) • Không được phép ghi đè: − Các phương thức static trong lớp cha − Các phương thức private trong lớp cha − Các phương thức hằng (final) trong lớp cha 15 Hạn chế ghi đè • Đôi lúc ta muốn hạn chế việc định nghĩa lại vì các lý do sau: − Tính đúng đắn: Định nghĩa lại một phương thức trong lớp dẫn xuất có thể làm sai lạc ý nghĩa của nó − Tính hiệu quả: Cơ chế kết nối động không hiệu quả về mặt thời gian bằng kết nối tĩnh. Nếu biết trước sẽ không định nghĩa lại phương thức của lớp cơ sở thì nên dùng từ khóa final đi với phương thức public final String baseName () { return “Person”; } 16 Bài tập 1 • Cho đoạn mã dưới đây: 1. float getVar() { return x; } 4. class SubClass extends BaseClass { 6.

// insert code here 8. } • Lựa chọn nào có thể chèn tại dòng 7? 1. public double getVar() { return x; } 2. public float getVar(float f){ return f; } 3.

float getVar() { return x; } 4. public float getVar() { return x; } 5. private float getVar() { return x; } 2020 Bài tập 2 • Cho đoạn mã dưới đây: 1. public String getName() { return “Super”; } 3.

class Sub extends Super { 5. } • Lựa chọn nào khi đặt vào dòng 5 trong đoạn mã trên gây ra lỗi biên dịch? 1. public void getName(String str) { } 2. public String getName() {return “Sub”; } 3.

public void getName() {} 21 21 2 Lớp trừu tượng Abstract class Lớp trừu tượng • Xét ví dụ: Lớp Shape − Là một lớp "không rõ ràng", khó hình dung ra các đối tượng cụ thể + Không thể thể hiện hóa (instantiate – tạo đối tượng của lớp) trực tiếp 24 Lớp trừu tượng • Đặc điểm của lớp trừu tượng − Không thể tạo đối tượng trực tiếp từ các lớp trừu tượng − Thường lớp trừu tượng được dùng để định nghĩa các "khái niệm chung", đóng vai trò làm lớp cơ sở cho các lớp "cụ thể" khác. − Chưa đầy đủ, thường được sử dụng làm lớp cha. Lớp con kế thừa nó sẽ hoàn thiện nốt. + Lớp trừu tượng thường chứa các phương thức trừu tượng không được định nghĩa 25 Phương thức trừu tượng • Là các phương thức “không rõ ràng”, khó đưa ra cách cài đặt cụ thể • Chỉ có chữ ký mà không có cài đặt cụ thể • Các lớp dẫn xuất có thể làm rõ - định nghĩa lại (overriding) các phương thức trừu tượng này 26 Cú pháp • Lớp trừu tượng − Khai báo với từ khóa abstract public abstract class Shape { // Nội dung lớp } • Phương thức trừu tượng − Khai báo với từ khóa abstract public abstract float calculateArea(); // CHÚ Ý Shape s = new Shape(); //Compile error 27 Ví dụ 1 abstract class Shape { protected String name; Shape(String n) { name = n; } public String getName() { return name; } public abstract float calculateArea(); } class Circle extends Shape { private int radius; Circle(String n, int r){ super(n); radius = r; } public float calculateArea() { float area = (float) (3.14 * radius * radius); return area; } } Lớp con bắt buộc phải override tất cả các phương thức abstract của lớp cha Lớp trừu tượng • Nếu một lớp có một hay nhiều phương thức trừu tượng thì nó phải là lớp trừu tượng • Lớp con khi kế thừa phải cài đặt cụ thể cho các phương thức trừu tượng của lớp cha → Phương thức trừu tượng không thể khai báo là final hoặc static.

Kết hợp KHÔNG hợp lệ Kết hợp hợp lệ abstract private abstract public abstract static abstract protected abstract final 29 Ví dụ 2 abstract class Point { private int x, y; public Point(int x, int y) { this.y = y; } public void move(int dx, int dy) { x += dx; y += dy; plot(); } public abstract void plot(); // phương thức trừu tượng không có // phần code thực hiện } Ví dụ 2 (tiếp) abstract class ColoredPoint extends Point { int color; public ColoredPoint(int x, int y, int color) { super(x, y); this.color = color; } } class SimpleColoredPoint extends ColoredPoint { public SimpleColoredPoint(int x, int y, int color) { super(x, y, color); } public void plot() {. } // code to plot a SimplePoint } Biểu diễn trong UML • Lớp trừu tượng không thể có đối tượng − Chứa phương thức trừu tượng − Chữ nghiêng Animal Lớp trừu tượng + communicate () Phương thức trừu tượng Không có đối tượng Sinh Vật trực tiếp Lion Tiger + communicate () + communicate () Tất cả các đối tượng là sư tử hoặc hổ 32 Bài tập 3 1. Đoạn mã dưới đây có lỗi gì không? abstract class ABC { void firstMethod() { System. Lớp nào là lớp trừu tượng, lớp nào có thể tạo đối tượng? abstract class A { } class B extends A { 33 3 Giao diện Interface Đa kế thừa và đơn kế thừa A B C • Đa kế thừa (Multiple Inheritance) − Một lớp có thể kế thừa nhiều lớp khác − C++ hỗ trợ đa kế thừa D • Đơn kế thừa (Single Inheritance) A − Một lớp chỉ được kế thừa từ một lớp khác E F − Java chỉ hỗ trợ đơn kế thừa → Đưa thêm khái niệm Giao diện (Interface) D 35 Vấn đề gặp phải trong đa kế thừa • Name collision • "Diamond shape" problem SomeClass Animal FlyingThing + color + color + getColor () + getColor () Animal FlyingThing + color + color Bird + getColor () + getColor () Bird 36 Giao diện • Giao diện (interface) − Là kiểu dữ liệu trừu tượng, được dùng để đặc tả các hành vi mà các lớp phải thực thi − Tương tự như giao thức (protocols) − Chứa các chữ ký phương thức (Mọi phương thức đều là phương thức trừu tượng) và các hằng − Giải quyết bài toán đa thừa kế, tránh các rắc rối nhập nhằng ngữ nghĩa • Giao diện trong Java − Được định nghĩa với từ khóa interface − Từ Java 8: có thêm phương thức default, static.

Từ Java 9, có thêm phương thức private và private static 38 Giao diện • Để trở thành giao diện, cần − Sử dụng từ khóa interface để định nghĩa − Chỉ được bao gồm: + Chữ ký các phương thức (method signature) + Các thuộc tính khai báo hằng (static & final) • Cú pháp khai báo giao diện trên Java: interface <Tên giao diện> <Giao diện con> extends <Giao diện cha> • Ví dụ: public interface DoiXung {…} public interface Can extends DoiXung {…} public interface DiChuyen {…} 39 Lớp thực thi giao diện • Lớp thực thi giao diện − Hoặc là lớp trừu tượng (abstract class) − Hoặc là bắt buộc phải cài đặt chi tiết toàn bộ các phương thức trong giao diện nếu là lớp instance. • Cú pháp thực thi giao diện <Lớp con> [extends <Lớp cha>] implements <Danh sách giao diện> • Ví dụ: public class HinhVuong extends TuGiac implements DoiXung, DiChuyen {. } 40 Interface 2DShape 3DShape Drawable Circle Rectangle Sphere Cube Square 41 Shape Action #x: int #name: String #y: int +getName():String +draw(Graphics) +calculateArea():float +moveTo(Graphics,int, int) +erase(Graphics) Circle -radius: float +calculateArea():float +draw(Graphics) +erase(Graphics) <<interface>> Shape Actable #name: String #x:int #y:int +getName():String +draw(Graphics) +moveTo(Graphics,int, int) +calculateArea():float +erase(Graphics) Circle -radius:float +calculateArea():float +draw(Graphics) +moveTo(Graphics,int,int) +erase(Graphics) Ví dụ import java.Graphics; abstract class Shape { protected String name; protected int x, y; Shape(String n, int x, int y) { name = n; this.y = y; } public String getName() { return name; } public abstract float calculateArea(); } interface Actable { public void draw(Graphics g); public void moveTo(Graphics g, int x1, int y1); public void erase(Graphics g); } class Circle extends Shape implements Actable { private int radius; public Circle(String n, int x, int y, int r) { super(n, x, y); radius = r; } public float calculateArea() { float area = (float) (3.14 * radius * radius); return area; } public void draw(Graphics g) { System out println("Draw circle at (" + x + “," + y + ")"); g.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ