8/24/2011

Mục tiêu của bài học

(cid:61550) Trình bày nguyên lý định nghĩa lại trong kế

thừa

Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội

(cid:61550) Đơn kế thừa và đa kế thừa (cid:61550) Giao diện và lớp trừu tượng (cid:61550) Sử dụng các vấn đề trên với ngôn ngữ lập

trình Java.

(cid:76)(cid:7852)(cid:80)(cid:32)(cid:84)(cid:82)(cid:204)(cid:78)(cid:72)(cid:32)(cid:72)(cid:431)(cid:7898)(cid:78)(cid:71)(cid:32)(cid:272)(cid:7888)(cid:73)(cid:32)(cid:84)(cid:431)(cid:7906)(cid:78)(cid:71) Bài 06. Một số kỹ thuật trong kế thừa

2

Nội dung

Nội dung

1. Định nghĩa lại

(Redefine/Overriding)

1. Định nghĩa lại (Redefine/Overiding) 2. Lớp trừu tượng (Abstract class) 3. Đơn kế thừa và đa kế thừa 4. Giao diện (Interface)

2. Lớp trừu tượng (Abstract class) 3. Đơn kế thừa và đa kế thừa 4. Giao diện (Interface)

3 4

class Shape {

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

protected String name; Shape(String n) { name = n; } public String getName() { return name; } public float calculateArea() { return 0.0f; }

(cid:61550) Lớp con có thể định nghĩa phương thức trùng

tên với phương thức trong lớp cha:

} 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;

}

}

5 6

1

8/24/2011

Thêm lớp Triangle

class Square extends Shape {

private int side; Square(String n, int s) {

class Triangle extends Shape { private int base, height; Triangle(String n, int b, int h) {

super(n); side = s;

super(n); base = b; height = h;

} public float calculateArea() {

} public float calculateArea() {

float area = (float) side * side; return area;

}

float area = 0.5f * base * height; return area;

}

}

}

7 8

this và super

package abc; public class Person {

protected String name; protected int age; public String getDetail() {

(cid:61550) this: (cid:61550) super:

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;

}

}

9 10

1. Định nghĩa lại hay ghi đè (3)

Ví dụ

class Parent {

(cid:61550) Một số quy định

public void doSomething() {} protected int doSomething2() {

return 0;

}

} class Child extends Parent {

protected void doSomething() {} protected void doSomething2() {}

}

11 12

2

8/24/2011

Ví dụ

Nội dung

class Parent {

public void doSomething() {} private int doSomething2() {

return 0;

}

1. Định nghĩa lại (Redefine/Overiding) 2. Lớp trừu tượng (Abstract class) 3. Đơn kế thừa và đa kế thừa 4. Giao diện (Interface)

} class Child extends Parent {

public void doSomething() {} private void doSomething2() {}

}

13 14

2. Lớp trừu tượng (2)

2. Lớp trừu tượng (Abstract Class)

(cid:61550) Không thể thể hiện hóa (instantiate – tạo đối

(cid:61550) Cú pháp?

tượng của lớp) trực tiếp

16 15

abstract class Shape {

Ví dụ lớp trừu tượng

protected String name; Shape(String n) { name = n; } public String getName() { return name; } public abstract float calculateArea();

} class Circle extends Shape {

import java.awt.Graphics; abstract class Action { protected int x, y; public void moveTo(Graphics g,

int x1, int y1) {

private int radius; Circle(String n, int r){

super(n); radius = r;

erase(g); x = x1; y = y1; draw(g);

}

}

public float calculateArea() {

float area = (float) (3.14 * radius * radius); return area;

abstract public void erase(Graphics g); abstract public void draw(Graphics g);

}

}

}

18 17

3

8/24/2011

Ví dụ lớp trừu tượng (2)

Nội dung

class Circle extends Action {

int radius; public Circle(int x, int y, int r) {

super(x, y); radius = r;

} public void draw(Graphics g) {

System out println("Draw circle at ("

+ x + "," + y + ")");

1. Định nghĩa lại (Redefine/Overiding) 2. Lớp trừu tượng (Abstract class) 3. Đơn kế thừa và đa kế thừa 4. Giao diện (Interface)

g.drawOval(x-radius, y-radius,

2*radius, 2*radius);

} public void erase(Graphics g) {

System.out.println("Erase circle at ("

+ x + "," + y + ")");

}

}

19 20

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

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

(cid:61550) Đa kế thừa (Multiple Inheritance)

(cid:61550) khác

A

B

C

SomeClass

Animal

FlyingThing

+ color + getColor ()

+ color + getColor ()

(cid:61550) Đơn kế thừa (Single Inheritance)

Animal

FlyingThing

D

+ color + getColor ()

+ color + getColor ()

Bird

A

E

Bird

F

21

D

(cid:65)(cid:99)(cid:116)(cid:105)(cid:111)(cid:110)

(cid:83)(cid:104)(cid:97)(cid:112)(cid:101)

(cid:35)(cid:110)(cid:97)(cid:109)(cid:101)(cid:58)(cid:32)(cid:83)(cid:116)(cid:114)(cid:105)(cid:110)(cid:103)

Nội dung

(cid:67)(cid:105)(cid:114)(cid:99)(cid:108)(cid:101)

(cid:43)(cid:103)(cid:101)(cid:116)(cid:78)(cid:97)(cid:109)(cid:101)(cid:40)(cid:41)(cid:58)(cid:83)(cid:116)(cid:114)(cid:105)(cid:110)(cid:103) (cid:43)(cid:99)(cid:97)(cid:108)(cid:99)(cid:117)(cid:108)(cid:97)(cid:116)(cid:101)(cid:65)(cid:114)(cid:101)(cid:97)(cid:40)(cid:41)(cid:58)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116) (cid:35)(cid:120)(cid:58)(cid:32)(cid:105)(cid:110)(cid:116) (cid:35)(cid:121)(cid:58)(cid:32)(cid:105)(cid:110)(cid:116) (cid:43)(cid:100)(cid:114)(cid:97)(cid:119)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41) (cid:43)(cid:109)(cid:111)(cid:118)(cid:101)(cid:84)(cid:111)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:44)(cid:105)(cid:110)(cid:116)(cid:44)(cid:32)(cid:105)(cid:110)(cid:116)(cid:41) (cid:43)(cid:101)(cid:114)(cid:97)(cid:115)(cid:101)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41)

(cid:45)(cid:114)(cid:97)(cid:100)(cid:105)(cid:117)(cid:115)(cid:58)(cid:32)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116)

(cid:83)(cid:104)(cid:97)(cid:112)(cid:101)

(cid:43)(cid:99)(cid:97)(cid:108)(cid:99)(cid:117)(cid:108)(cid:97)(cid:116)(cid:101)(cid:65)(cid:114)(cid:101)(cid:97)(cid:40)(cid:41)(cid:58)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116) (cid:43)(cid:100)(cid:114)(cid:97)(cid:119)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41) (cid:43)(cid:101)(cid:114)(cid:97)(cid:115)(cid:101)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41)

(cid:60)(cid:60)(cid:105)(cid:110)(cid:116)(cid:101)(cid:114)(cid:102)(cid:97)(cid:99)(cid:101)(cid:62)(cid:62) (cid:65)(cid:99)(cid:116)(cid:97)(cid:98)(cid:108)(cid:101)

1. Định nghĩa lại (Redefine/Overiding) 2. Lớp trừu tượng (Abstract class) 3. Đơn kế thừa và đa kế thừa 4. Giao diện (Interface)

(cid:35)(cid:110)(cid:97)(cid:109)(cid:101)(cid:58)(cid:32)(cid:83)(cid:116)(cid:114)(cid:105)(cid:110)(cid:103) (cid:35)(cid:120)(cid:58)(cid:105)(cid:110)(cid:116)(cid:32)(cid:32)(cid:35)(cid:121)(cid:58)(cid:105)(cid:110)(cid:116)

(cid:67)(cid:105)(cid:114)(cid:99)(cid:108)(cid:101)

(cid:43)(cid:103)(cid:101)(cid:116)(cid:78)(cid:97)(cid:109)(cid:101)(cid:40)(cid:41)(cid:58)(cid:83)(cid:116)(cid:114)(cid:105)(cid:110)(cid:103) (cid:43)(cid:99)(cid:97)(cid:108)(cid:99)(cid:117)(cid:108)(cid:97)(cid:116)(cid:101)(cid:65)(cid:114)(cid:101)(cid:97)(cid:40)(cid:41)(cid:58)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116) (cid:43)(cid:100)(cid:114)(cid:97)(cid:119)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41) (cid:43)(cid:109)(cid:111)(cid:118)(cid:101)(cid:84)(cid:111)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:44)(cid:105)(cid:110)(cid:116)(cid:44)(cid:32)(cid:105)(cid:110)(cid:116)(cid:41) (cid:43)(cid:101)(cid:114)(cid:97)(cid:115)(cid:101)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41)

(cid:45)(cid:114)(cid:97)(cid:100)(cid:105)(cid:117)(cid:115)(cid:58)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116)

23 24 (cid:43)(cid:99)(cid:97)(cid:108)(cid:99)(cid:117)(cid:108)(cid:97)(cid:116)(cid:101)(cid:65)(cid:114)(cid:101)(cid:97)(cid:40)(cid:41)(cid:58)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116) (cid:43)(cid:100)(cid:114)(cid:97)(cid:119)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41) (cid:43)(cid:109)(cid:111)(cid:118)(cid:101)(cid:84)(cid:111)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:44)(cid:105)(cid:110)(cid:116)(cid:44)(cid:105)(cid:110)(cid:116)(cid:41) (cid:43)(cid:101)(cid:114)(cid:97)(cid:115)(cid:101)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41)

4

8/24/2011

4. Giao diện

4. Giao diện (2)

(cid:8226) Không thể thể hiện hóa (instantiate) trực tiếp

(cid:61550) Cú pháp?

26 25

import java.awt.Graphics; abstract class Shape {

Ví dụ

protected String name; protected int x, y; Shape(String n, int x, int y) {

name = n; this.x = x; this.y = y;

(cid:83)(cid:104)(cid:97)(cid:112)(cid:101)

(cid:60)(cid:60)(cid:105)(cid:110)(cid:116)(cid:101)(cid:114)(cid:102)(cid:97)(cid:99)(cid:101)(cid:62)(cid:62) (cid:65)(cid:99)(cid:116)(cid:97)(cid:98)(cid:108)(cid:101)

(cid:35)(cid:110)(cid:97)(cid:109)(cid:101)(cid:58)(cid:32)(cid:83)(cid:116)(cid:114)(cid:105)(cid:110)(cid:103)(cid:32)(cid:32)(cid:35)(cid:120)(cid:58)(cid:105)(cid:110)(cid:116)(cid:32)(cid:32)(cid:35)(cid:121)(cid:58)(cid:105)(cid:110)(cid:116)

} public String getName() {

return name;

(cid:43)(cid:103)(cid:101)(cid:116)(cid:78)(cid:97)(cid:109)(cid:101)(cid:40)(cid:41)(cid:58)(cid:83)(cid:116)(cid:114)(cid:105)(cid:110)(cid:103) (cid:43)(cid:99)(cid:97)(cid:108)(cid:99)(cid:117)(cid:108)(cid:97)(cid:116)(cid:101)(cid:65)(cid:114)(cid:101)(cid:97)(cid:40)(cid:41)(cid:58)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116) (cid:43)(cid:100)(cid:114)(cid:97)(cid:119)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41) (cid:43)(cid:109)(cid:111)(cid:118)(cid:101)(cid:84)(cid:111)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:44)(cid:105)(cid:110)(cid:116)(cid:44)(cid:32)(cid:105)(cid:110)(cid:116)(cid:41) (cid:43)(cid:101)(cid:114)(cid:97)(cid:115)(cid:101)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41)

} public abstract float calculateArea();

(cid:67)(cid:105)(cid:114)(cid:99)(cid:108)(cid:101)

(cid:45)(cid:114)(cid:97)(cid:100)(cid:105)(cid:117)(cid:115)(cid:58)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116)

} interface Actable {

(cid:43)(cid:99)(cid:97)(cid:108)(cid:99)(cid:117)(cid:108)(cid:97)(cid:116)(cid:101)(cid:65)(cid:114)(cid:101)(cid:97)(cid:40)(cid:41)(cid:58)(cid:102)(cid:108)(cid:111)(cid:97)(cid:116) (cid:43)(cid:100)(cid:114)(cid:97)(cid:119)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41) (cid:43)(cid:109)(cid:111)(cid:118)(cid:101)(cid:84)(cid:111)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:44)(cid:105)(cid:110)(cid:116)(cid:44)(cid:105)(cid:110)(cid:116)(cid:41) (cid:43)(cid:101)(cid:114)(cid:97)(cid:115)(cid:101)(cid:40)(cid:71)(cid:114)(cid:97)(cid:112)(cid:104)(cid:105)(cid:99)(cid:115)(cid:41)

public void draw(Graphics g); public void moveTo(Graphics g, int x1, int y1); public void erase(Graphics g);

}

27 28

class Circle extends Shape implements Actable {

private int radius; public Circle(String n, int x, int y, int r){

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

super(n, x, y); radius = r;

} public float calculateArea() {

Lớp trừu trượng

Giao diện

float area = (float) (3.14 * radius * radius); return area;

} public void draw(Graphics g) {

System out println("Draw circle at ("

+ x +

," + y + ")");

g.drawOval(x-radius,y-radius,2*radius,2*radius); } public void moveTo(Graphics g, int x1, int y1){

erase(g); x = x1; y = y1; draw(g);

} public void erase(Graphics g) {

Erase circle at ("

System out println(“

+ x +

," + y + ")");

// paint the region with background color...

}

}

29 30

5

8/24/2011

Nhược điểm của Giao diện để giải quyết vấn đề Đa kế thừa

31

6