Bài 5: Lớp trừu tượng

Lê Hồng Phương phuonglh@gmail.com Khoa Toán-Cơ-Tin học, Trường Đại học Khoa học Tự nhiên, ĐHQG Hà Nội

Nội dung

● Lớp trừu tượng

● So sánh giao diện và lớp trừu tượng

● Sử dụng lớp trừu tượng

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

2

Lớp trừu tượng

● Lớp trừu tượng là lớp được khai báo là abstract.

● Phương thức trừu tượng là phương thức được khai

báo abstract và không có thân.

● Ví dụ:

public abstract class GraphicObject {

// fields and methods

}

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

3

abstract void moveTo(double deltaX, double deltaY);

Lớp trừu tượng

● Lớp trừu tượng không nhất thiết chứa phương thức

trừu tượng.

● Nếu một lớp có chứa một phương thức trừu tượng

thì lớp đó là lớp trừu tượng và phải được khai báo là abstract.

public abstract class GraphicObject {

// declare fields // declare non-abstract methods abstract void moveTo(double deltaX, double deltaY); abstract void draw();

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

4

}

Lớp trừu tượng

● Nếu A là một lớp trừu tượng, B là lớp con của A và B

không không cung cấp cài đặt cụ thể cho mọi phương thức trừu tượng của A thì B cũng phải là lớp trừu tượng.

● Tương tự như đối với giao diện, ta không thể tạo đối

tượng của một lớp trừu tượng:

– GraphicObject go = new GraphicObject();

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

5

Lớp trừu tượng

● Vì sao sử dụng lớp trừu tượng?

– Để cung cấp một cài đặt chung (dữ liệu, phương thức)

cho các lớp con.

– Các lớp con cung cấp cài đặt riêng phù hợp với chúng, không phải cài đặt lại những phần chung.

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

6

So sánh giao diện và lớp trừu tượng

● Giống nhau:

– Cả giao diện và lớp trừu tượng đều là các kiểu trừu

tượng.

– Đều không thể tạo đối tượng từ các kiểu giao diện và

lớp trừu tượng.

● Khác nhau:

– Giao diện chỉ có thể chứa các hằng số (static, final) và các phương thức trừu tượng. Lớp trừu tượng có thể chứa mọi trường dữ liệu và các phương thức trừu tượng hoặc không trừu tượng.

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

7

So sánh giao diện và lớp trừu tượng

● Khác nhau:

– Mức trừu tượng khác nhau: giao diện trừu tượng

hoàn toàn; lớp trừu tượng thường chỉ trừu tượng một phần.

– Giao diện được sử dụng để mô phỏng sự giống nhau giữa các đối tượng cài đặt nó. Lớp trừu tượng được sử dụng để cung cấp cài đặt chung cho mọi lớp con của nó.

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

8

Sử dụng lớp trừu tượng

● Trong một phần mềm đồ họa, ta cần vẽ nhiều đối

tượng đồ họa khác nhau.

● Mỗi đối tượng đối tượng có trạng thái (vị trí, hướng, màu đường kẻ, màu tô...) và hành xử (di chuyển, quay, thay đổi kích thước, vẽ...)

GraphicObject

Rectangle

Circle

Line

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

9

Sử dụng lớp trừu tượng

● Một số trạng thái và hành xử của các đối tượng này

là giống nhau. Ví dụ:

– Trạng thái: vị trí, màu tô

– Hành xử: di chuyển

● Một số trạng thái và hành xử cần có cài đặt khác

nhau: Ví dụ:

– thay đổi kích thước, vẽ.

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

10

Sử dụng lớp trừu tượng

● Các hình 2-D đều có thông tin tọa độ của gốc (x, y).

Thao tác di chuyển hình có cài đặt chung.

public abstract class GraphicObject {

protected int x; protected int y;

void moveTo(int newX, int newY) {

x = newX; y = newY;

}

abstract void draw();

abstract void resize();

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

11

}

Sử dụng lớp trừu tượng

● Hình tròn và hình chữ nhật có cách vẽ và thay đổi

kích thước khác nhau.

public class Rectangle extends

GraphicObject { public class Circle extends GraphicObject {

@Override void draw() { // ... @Override void draw() { // ...

} }

@Override void resize() { @Override void resize() {

// ... // ...

} }

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

12

} }

Sử dụng lớp trừu tượng

● Cơ chế đa hình cho phép gọi các phương thức thích

hợp trên mỗi đối tượng đồ họa.

public class GraphicObjectTester {

public static void main(String[] args) {

GraphicObject go;

go = new Circle(); go.moveTo(5, 10); go.draw();

go = new Rectangle(); go.moveTo(20, 30); go.draw();

}

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

13

}

Sử dụng lớp trừu tượng

● Trong thực tế, lớp trừu tượng thường cung cấp một

cài đặt bộ phận cho một hoặc nhiều giao diện.

public interface Runnable {

public void run();

}

public abstract class Vehicle implements Runnable {

protected String engineType; protected Color color;

// constructors and non-abstract methods...

abstract public void run();

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

14

}

Sử dụng lớp trừu tượng

public class Car extends Vehicle { // constructors and methods

@Override public void run() {

// ...

}

}

public class Bike extends Vehicle { // constructors and methods

@Override public void run() {

// ...

}

2012-2013

Lập trình hướng đối tượng: Lớp trừu tượng

15

}