Tải bản đầy đủ (.pdf) (57 trang)

Bài giảng Lập trình hướng đối tượng: Quan hệ giữa các lớp

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.71 MB, 57 trang )

Quan hệ giữa các lớp
v 2.3 - 09/2018

Lê Viết Mẫn -

1

Quan hệ giữa các lớp


các bạn đã có thể...
Virus.cs
Virus
- reproductionRate : float
- resistance : float
-instance defaultReproductionRate : float = 0.1
<<constructor>>
+ Virus(newResistance : float)
+ Virus(newReproductionRate : float, newResistance : float)
<>
+ reproduce(immunity : float) : Virus*
+ survive(immunity : float) : bool

Lê Viết Mẫn -

2

Quan hệ giữa các lớp


chúng ta sẽ học...



cài đặt mô hình

Lê Viết Mẫn -

bằng C#

3

Quan hệ giữa các lớp


Nội dung
1. Các mối quan hệ lớp
2. Thừa kế
3. Một số vấn đề khác
4. Ví dụ - Pet

Lê Viết Mẫn -

4

Quan hệ giữa các lớp


Các mối quan hệ lớp

Lê Viết Mẫn -

5


Quan hệ giữa các lớp


Mối quan hệ lớp





Cho phép các đối tượng tương tác với nhau




Các đối tượng giao tiếp bằng cách gởi thông điệp thông qua các kết nối
Các đối tượng có thể truy xuất các hàm, thuộc tính của các đối tượng mà nó
kết nối

Được thể hiện thông qua các đồ thị liên kết




Các nút / đỉnh là các lớp (hình chữ nhật)
Các cạnh / cung là các quan hệ

Các mối quan hệ lớp







Association - q.h kết hợp
Aggregation - q.h thu nạp
Composition - q.h thành phần
Generization - tổng quát hoá (kỹ thuật thừa kế)

Lê Viết Mẫn -

6

Quan hệ giữa các lớp


Association - q.h kết hợp
Person

work at
Company
Employee
Employer



Quan hệ kết hợp cho phép các đối tượng gọi các hàm, thuộc tính lẫn
nhau




Các đối tượng kết hợp không phải tồn tại mãi và không bắt buộc
được tạo ra cùng lúc






Cho phép null
Không được phép hủy cấp phát bộ nhớ của đối tượng nó tham chiếu đến
Tạo ra đối tượng mới bên ngoài lớp rồi mới gán vào cho lớp để lưu trữ
Khi gán đối tượng mới thì không xoá đối tượng cũ

Lê Viết Mẫn -

7

Quan hệ giữa các lớp


Ví dụ - q.h kết hợp
Person

Company

work at
-workAt:Company
-employee:Person
Employee

Employer

Person.cs

Company.cs

using System;

using System;

namespace AssociationEx
{
class Person
{
string name;
Company workAt;

namespace AssociationEx
{
class Company
{
string name;
Person employee;

...
}
}

ần
h

p
ành rong
h
t
n
ế
i
b
ny t u trữ
a
o
p

T
om để lư p
C
u
kiể erson với lớ
P
lớp uan hệ
q
mối pany
Com

Lê Viết Mẫn -

...
}

ần

h
p
ành g lớp
h
t
n
on ữ
ế
i
r
t
b
Tạo Person lưu tr
kiểu pany để với lớp
Com uan hệ
q
mối on
Pers

}

8

Quan hệ giữa các lớp


Ví dụ - q.h kết hợp
Person.cs
using System;


ng

ư
n
it
ê

b
đ

Tạo pany t
ào
v
n
Com i rồi gá
à
ngo

namespace AssociationEx
{
class Person
{
string name;
Company workAt;

o
h
C

p

é
h

l
l
nu

// Có thể cho
public Person
public Person
public Person

p

phép gán đối tượng ngay tại cấu tử
(string name) {...}
(string name, Company c) {...}
() {}

public string Name { get {...} set {...} }
// hoặc gán đối tượng mới thông qua thuộc tính
public Company WorkAt { get {...} set {...} }
...
}
}

Lê Viết Mẫn -

ng


ư
ối t từ bên
đ
o
Tạ pany
ào
v
n
Com i rồi gá
à
ngo
9

Không có Huỷ tử
để xoá đối tượng
trong biến
workAt

Khi gán đối
tượng mới thì
không xoá đối
tượng cũ

Quan hệ giữa các lớp


Multiplicity - bản số
Một khách hàng có thể
có nhiều đơn hàng


Order
-belongTo:Customer

*

1

belong to

Order.cs

Một đơn hàng chỉ thuộc
về một khách hàng

Customer
-orders:List of Orders

Customer.cs

using System;

using System;
using System.Collections.Generic;

namespace AssociationEx
{
class Order
{
int id;
Customer belongTo;


namespace AssociationEx
{
class Customer
{
string name;
List<Order> orders;

...
}

ặc
o
h
ray bản
r
A

g
Dùn để hỗ tr
List
số

...

}

}
}


Lê Viết Mẫn -

10

Quan hệ giữa các lớp


Navigability - tính khả điều hướng
Order
-belongTo:Customer



*

belong to

1

Customer

Đơn hàng biết nó thuộc về khách hàng nào, nhưng khách hàng không biết nó có
đơn hàng nào
Order.cs

Customer.cs

using System;

using System;


namespace AssociationEx
{
class Order

namespace AssociationEx
{
class Customer
{
string name;

{

int id;
Customer belongTo;

...
}

...

}

}
}

Lê Viết Mẫn -

11


Quan hệ giữa các lớp


Aggregation - q.h thu nạp



Quan hệ thu nạp là quan hệ part-of
Cài đặt quan hệ



Sử dụng các liên kết yếu






Các thành phần và toàn thể có vòng đời độc lập



Bỏ kết nối với đối tượng lớp thành phần trong hàm huỷ tử của lớp toàn thể

Tạo mối quan hệ khi cần thiết
Gán đối tượng mới thì bỏ kết nối với đối tượng cũ
Tạo ra đối tượng mới của lớp thành phần bên trong hoặc bên ngoài lớp
toàn thể


Lê Viết Mẫn -

12

Quan hệ giữa các lớp


Ví dụ - q.h thu nạp
Car.cs
using System;
using System.Collections.Generic;
namespace AggregationEx
{
class Car
{
Engine engine;
List<Door> doors;
}
}

Lê Viết Mẫn -

13

Quan hệ giữa các lớp


Ví dụ - q.h thu nạp
using System;
namespace AggregationEx

{
class Car
{
Engine engine;

Car.cs

public Car () {}
// Xoá đối tượng trong hàm huỷ tử
~Car () { engine = null; }

ối
đ
i
i vớ h

n
ết p thàn
k

B
lớ
g
àm
n
h

g
n


o
r
t
ớp
n
l

a
h
p
củ

t
huỷ thể
toàn

// Tạo đối tượng mới bên ngoài lớp rồi gán thông qua thuộc tính
// không cần thao tác xoá đối tượng cũ
public Engine CarEngine { get {...} set {...} }

}
}

// Tạo đối tượng mới bên trong lớp
public void SetEngine(string nameEngine)
{
engine = new Engine(nameEngine);
}
ng


ư
t
i

đ
...
Gán
i

t nố
ế
k

b
ì
h
mới t
g cũ
n

ư
t
i

với đ

Lê Viết Mẫn -

14


ng

ư
t
ối
nh
đ
à
a
h
t
r
Tạo của lớp g
n
mới bên tro ài
o
phần bên ng
c
hoặ oàn thể
t
lớp

Quan hệ giữa các lớp


Composition - q.h thành phần



Quan hệ thành phần là biến thể mạnh hơn của quan hệ thu nạp




Một thành phần chỉ thuộc về một toàn thể
Các thành phần thường sống và chết theo toàn thể

Cài đặt quan hệ



Sử dụng liên kết mạnh









Các thành phần và toàn thể có đời sống trùng lặp nhau
Khởi tạo các thành phần trong cấu tử của toàn thể
Các thành phần chỉ thuộc về một toàn thể
Các thành phần không thể thay đổi trong suốt quá trình thực thi
Tạo đối tượng lớp thành phần bên trong lớp toàn thể
Không gán đối tượng mới, chỉ cho phép thay đổi dữ liệu
Xoá đối tượng lớp thành phần trong hàm huỷ tử của lớp toàn thể

Lê Viết Mẫn -


15

Quan hệ giữa các lớp


Ví dụ - q.h thành phần
Company.cs
using System;
using System.Collections.Generic;
namespace CompositionEx
{
class Company
{
List<Employee> employees;
TaxRegistration taxReg;
...
}
}

Lê Viết Mẫn -

16

Quan hệ giữa các lớp


Ví dụ - q.h thành phần
using System;

ớp

l
g
ợn
ư
t
i
ên
đố
b
o
n


T
ph oàn thể
h
n
thà
pt

l
g
tron

namespace CompositionEx
{
class Company
{
TaxRegistration taxReg;


Company.cs

public Company () {}
// Tạo đối tượng mới bên trong cấu tử
public Company (string id, int day, int month, int year)
{ taxReg = new TaxRegistration( id, day, month, year ); }
// Xoá đối tượng trong hàm huỷ tử
~Car () { taxReg = null; }

ng

ư
it

đ
ần
h
á
p
o

X
h
t
n
à

h
u
t

h
m
lớp
à

h
h
t
g
n
n
tro ớp toà
l
của

// Chỉ cho phép thay đổi dữ liệu, không gán đối tượng mới
public string TaxReg { get {...} set { taxReg.ID = value; } }

đối
n
á
g g i, chỉ
n
ô
ổi
Kh g mớ
đ
y
a
n

tượ hép th
p
cho ệu
i
dữ l

...
}
}

Lê Viết Mẫn -

17

Quan hệ giữa các lớp


So sánh các quan hệ
Kết hợp

Thu nạp
Liên kết yếu

Tạo ra đối tượng mới
bên ngoài lớp rồi mới
gán vào cho lớp để lưu
trữ

Thành phần
Liên kết mạnh


Tạo ra đối tượng mới
Tạo đối tượng lớp thành
của lớp thành phần bên
phần bên trong lớp toàn
trong hoặc bên ngoài
thể
lớp toàn thể

Khi gán đối tượng mới Gán đối tượng mới thì
Không gán đối tượng
thì không xoá đối tượng bỏ kết nối với đối tượng mới, chỉ cho phép thay


đổi dữ liệu
Không được phép hủy
cấp phát bộ nhớ của đối
tượng nó tham chiếu
đến

Bỏ kết nối với đối tượng
Xoá đối tượng lớp thành
lớp thành phần trong
phần trong hàm huỷ tử
hàm huỷ tử của lớp toàn
của lớp toàn thể
thể

Lê Viết Mẫn -


18

Quan hệ giữa các lớp


Inheritance - Thừa kế

Lê Viết Mẫn -

19

Quan hệ giữa các lớp


Generalization - tổng quát hoá


Tổng quát hóa gom những thứ giống nhau giữa vài lớp trong
một lớp cha (superclass)



Cụ thể hóa (specialization) thêm những thứ khác nhau vào
trong lớp con

Text

Những đặc tính giống nhau
được đặt ở lớp cha


Những đặc tính khác nhau
được tách ra đặt ở các lớp con

Lê Viết Mẫn -

20

Quan hệ giữa các lớp


Phân cấp thừa kế
Shape

Cụ thể hóa

Elipse

Polygon

Circle

Rectangle

Khái quát hóa
Lê Viết Mẫn -

Square

21


Rhombus

Trapezoid

Quan hệ giữa các lớp


Thừa kế







Là một quan hệ giữa một lớp và một phiên bản cụ thể hơn
Sự trừu tượng cho phép chia sẻ những điểm tương tự giữa các
lớp trong khi ngăn chặn những điểm khác biệt




Cơ chế cho phép sử dụng lại mã nguồn
Sự đơn giản hóa về khái niệm bằng cách làm giảm số lượng đặc tính riêng

Lớp con (lớp phái sinh) thừa kế tất cả các đặc tính của lớp cha
(lớp cơ sở)
Một thể hiện của lớp con là một thể hiện của cả lớp cha của nó
Nạp chồng - lớp con định nghĩa các hàm thành phần cùng tên
và cùng tham số với các hàm thành phần trong lớp cha


Lê Viết Mẫn -

22

Quan hệ giữa các lớp


Cái gì được thừa kế ?





Được thừa kế




Các thành phần dữ liệu
Hầu hết các hàm thành phần, thuộc tính

Các hàm không được thừa kế





Cấu tử
Hủy tử

Toán tử gán (=)

Tất cả các cấu tử và hủy tử được thực thi theo cây phân cấp




Các cấu tử thực thi từ trên xuống
Các hủy tử thực thi từ dưới lên

Lê Viết Mẫn -

23

Quan hệ giữa các lớp


Ví dụ

Lê Viết Mẫn -

24

Quan hệ giữa các lớp


Kiểu dữ liệu


Một lớp định nghĩa một tập các đối tượng (hay một kiểu dữ liệu)


con người ở HCE
Lê Viết Mẫn -

25

Quan hệ giữa các lớp


×