Bài giảng Kỹ thuật lập trình- Chương 4: Lớp và đối tượng cung cấp cho người học các kiến thức: Lập trình truyền thống và lập trình hướng đối tượng, các khái niệm liên quan tới Lớp và đối tượng,... Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 1Chương 4
Lớp và đối tượng
Trang 2Lập trình truyền thống và lập trình hướng đối tượng
Trang 3 Phương pháp tiếp cận của lập trình truyền thống
Lập trình tuyến tính.
Lập trình cấu trúc
Ưu điểm
Chương trình rõ ràng, dễ hiểu, dễ theo dõi.
Tư duy giải thuật rõ ràng.
Khuyết điểm
Không hỗ trợ việc sử dụng lại mã nguồn.
Khi thay đổi cấu trúc dữ liệu, phải thay đổi giải thuật.
Phải giải quyết các mối quan hệ vĩ mô giữa các module phần mềm trong các dự án lớn.
Trang 4 Đặc điểm cơ bản
Tập trung vào dữ liệu thay cho các hàm.
Chương trình được chia thành các đối tượng độc lập.
Cấu trúc dữ liệu được thiết kế sao cho đặc tả được các đối tượng.
Dữ liệu được che giấu, bao bọc.
Các đối tượng trao đổi với nhau thông qua các hàm.
Chương trình được thiết kế theo hướng tiếp cận từ dưới lên.
Trang 5 Một số ưu điểm nổi bật
Không có nguy cơ dữ liệu bị thay đổi tự do trong chương trình.
Khi thay đổi cấu trúc dữ liệu của một đối tượng, không cần thay đổi mã nguồn của các đối tượng khác.
Có thể sử dụng lại mã nguồn, tiết kiệm tài nguyên.
Phù hợp với các dự án phần mềm lớn, phức tạp.
Trang 6Khái niệm đối tượng (object) trong lập trình
hướng đối tượng giống như một đối tượng cụ thể
tượng, gọi tắt là phương thức (method).
Trang 10Các đối tượng có các đặc điểm (thuộc tính và
phương thức) giống nhau được gom nhóm thành
một lớp để phân biệt với các đối tượng khác và dễ
quản lý
hay là kiểu (type) của đối tượng
Trang 11Như vậy Lớp là một khái niệm trừu tượng, dùng
để chỉ một tập hợp các đối tượng có mặt trong hệ
Trang 12Một Lớp có thể có một trong các khả năng sau:
Hoặc chỉ có thuộc tính, không có phương thức.
Hoặc chỉ có phương thức, không có thuộc tính.
Hoặc có cả thuộc tính và phương thức, trường hợp này
là phổ biến nhất.
các lớp trừu tượng Các lớp này không có đối
tượng tương ứng
Trang 13Không gian tên (namespace)
Một nhóm các lớp (classes) và giao diện (interfaces)
được tổ chức thành một đơn vị quản lý theo hình thức
không gian tên gọi là namespace.
Lợi ích của namespace là tổ chức sắp xếp lại hệ thống
thông tin các lớp trong dự án một cách khoa học, giúp
cho việc theo dõi bảo trì dự án được tốt nhất.
Trang 14Tính trừu tượng:
Lớp (Class) là một khái niệm trừu tượng, đối tượng là
một thể hiện cụ thể của lớp.
Ví dụ:
Bản thiết kế của chiếc xe hơi là lớp.
Chiếc xe hơi được tạo ra từ bản thiết kế là đối tượng.
Class
Object
Trang 15Tính trừu tượng:
Từ những đối tượng giống nhau: trừu tượng hóa thành
một lớp:
Chỉ đưa ra các thuộc tính và phương thức cần thiết của
đối tượng trong lập trình.
Ví dụ:
Class Objects
Trừu tượng hóa
Trang 16Tính đóng gói:
Mỗi lớp được xây dựng để thực hiện một nhóm chức
năng đặc trưng của riêng lớp đó.
Tất cả mọi thao tác truy xuất vào thành phần dữ liệu từ
đối tượng này qua đối tượng khác phải được thực hiện
bởi các phương thức (method) của chính đối tượng
chứa dữ liệu.
Tính đóng gói cho phép dấu thông tin của đối tượng
bằng cách kết hợp thông tin và các phương thức liên
quan đến thông tin trong đối tượng.
Trang 17Tính đóng gói:
Ví dụ:
ngungXe() chayToi() chayLui() kiemTraXang()
Trang 18bổ sung thêm các thành phần mới.
Trang 19Tính kế thừa:
Ví dụ:
Trang 20Quy tắc đặt tên Lớp trong C#
mỗi từ nên viết hoa
được các Lớp, các đối tượng, thuộc tính và
phương thức của đối tượng???
Trang 21class TenLop {
//khai báo biến lớp
Trang 22Định nghĩa lớp Phân Số:
class PhanSo{
//khai báo biến lớp
Trang 23public class PhanSo
public int MauSo {
get ;
set ; }
public override string ToString() {
return this TuSo+ "/" + this MauSo;
} }
Properties:
Trang 24TenLop tenBien = new TenLop();
Ví dụ:
PhanSo psA = new PhanSo();
XeHoi xeHoiB = new XeHoi();
Từ khóa new dùng để cấp phát bộ nhớ cho đối
tượng psA và xeHoiB là 2 biến đối tượng trỏ tới 2
vùng nhớ được cấp phát trong thanh RAM
psA
xeHoiB
RAM
Trang 26Lưu trữ tình trạng của đối tượng
Ví dụ
public int tuSo;
private int mauSo
protected int soBanhXe;
Truy xuất biến lớp:
tenDoiTuong.bienLop
Trang 27Các hàm bên trong lớp
Trang 28 Dùng cho các thành phần lớp không phụ thuộc vào đối
tượng cụ thể
Có thể truy cập trong bản thân lớp
Được truy cập trực tiếp từ tên lớp
Phương thức static chỉ truy cập được những thành
viên static của lớp
Truy cập:
TenLop.TenBien
TenLop.TenPhuongThuc()
Có thể hiểu static là ô nhớ chia sẻ chung, khi biến
static thay đổi giá trị thì toàn bộ các đối tượng đều
thấy sự thay đổi này.
Trang 29Khởi tạo giá trị ban đầu cho đối tượng khi khai báo
class TenLop
{
public TenLop() {
} }
Trang 30Là constructor không có tham số và không thực
hiện lệnh gì cả (hoặc thực hiện một số lệnh khởi
tạo mặc định theo chủ ý của Lập trình viên)
sẽ tự thêm constructor mặc định
Trang 31Một lớp có thể có nhiều constructor
ứng khi khai báo
mặc định sẽ không có Nếu muốn sử dụng thì phải
khai báo lại
Trang 32class PhanSo
{
//khai báo biến lớp
private int tuSo;
private int mauSo;
public PhanSo() {
Trang 33Khởi tạo đối tượng phân số có tử số = 0, mẫu số = 1:
Trang 34Tham khảo đến đối tượng hiện hành
biến lớp, sử dụng this để chỉ biến lớp
class PhanSo {
private int tuSo ; private int mauSo ;
public PhanSo(int tuSo, int mauSo) {
} }
Trang 35Đối tượng là kiểu tham chiếu
Nếu có câu lệnh tác động đến giá trị các biến lớp
của đối tượng trong phương thức đối tượng bị
thay đổi sau khi hoàn tất phương thức
Trang 36Thay đổi tên biến thay đổi code ở những chỗ
dùng biến?
Kiểm tra hợp lệ khi gán giá trị biến?
lớp?
Trang 37 Không cho phép truy cập biến lớp
class PhanSo
{
private int tuSo;
public int mauSo;
public int LayTuSo() {
return tuSo;
} public void GanTuSo(int gt) {
tuSo = gt;
} }
Trang 38Dùng để bảo vệ việc truy cập biến lớp
nhiều đến chương trình
Trang 39class PhanSo {
private int tuSo;
private int mauSo;
public int TuSo {
get { return tuSo; } set { tuSo = value; } }
public int MauSo {
get { return mauSo; } set { mauSo = value; } }
}
Trang 40class PhanSo {
private int tuSo;
private int mauSo;
public int TuSo { … }
public int MauSo {
get { return mauSo; } set
}
Trang 41Không cho người dùng sửa giá trị biến
Chỉ có get, không có set
class PhanSo {
private int tuSo;
private int mauSo;
private double giaTri;
public double GiaTri {
get { return giaTri; } }
public double LayGiaTri() {
giaTri = (double)tuSo / (double)mauSo;
return giaTri;
} }
Trang 42class PhanSo
{
private int tuSo;
private int mauSo;
private double giaTri;
public int TuSo{…}
public int MauSo{…}
public double GiaTri {
get { return (double)tuSo / (double)mauSo; } }
}
Trang 44Xây dựng hàm để thực hiện tính toán
class PhanSo
{
private int tuSo;
private int mauSo;
public PhanSo Cong(PhanSo b) {
PhanSo c = new PhanSo();
c.TuSo = this.MauSo * b.TuSo + this.TuSo * b.MauSo;
c.MauSo = this.MauSo * b.MauSo;
return c;
} }
Trang 45public static PhanSo operator + ( PhanSo trai, PhanSo phai) {
PhanSo c = new PhanSo();
c.TuSo = trai.MauSo * phai.TuSo
+ trai.TuSo * phai.MauSo;
c.MauSo = trai.MauSo * phai.MauSo;
return c;
}
Trang 46Các toán tử logic phải đi đôi với nhau
> và <
>= và <=
== và !=
Trang 48Một lớp có nhiều phương thức, có những phương
thức cung cấp ra ngoài cho các đối tượng khác sử
dụng (public, gọi là Service method), có phương
phức chỉ sử dụng trong lớp (private, gọi là Support
Method)
Trang 49public class TamGiac
{
public int CanhA { get ; set ; }
public int CanhB { get ; set ; }
public int CanhC { get ; set ; }
private bool laHopLe() {
if (CanhA > 0 && CanhB > 0 && CanhC > 0 &&
(CanhA + CanhB) > CanhC &&
(CanhB + CanhC) > CanhA &&
(CanhA + CanhC) > CanhB)
return true ;
return false ; }
public int ChuVi() {
if (laHopLe() == false )
return -1;
return CanhA + CanhB + CanhC;
} }
Trang 50Overloading Method:
thức cùng tên nhưng khác nhau về Signature
dữ liệu các đối số hoặc thứ tự các đối số
phương thức và giúp việc gọi hàm “uyển chuyển”
Overloading Method
Trang 52C# cung cấp một loại phương thức đặc biệt đó là
Parameter List, cũng là một trường hợp đặc biệt
của Overloading Method
phương thức Sum cũng được
public int Sum( params int []arr) {
Sum(1, 5, -8,2)
Trang 53Alias là đặc điểm mà trên một ô nhớ có nhiều biến
đối tượng cùng trỏ tới
Ví dụ:
Lúc này trên thanh RAM sẽ có 2 ô nhớ cấp phát cho 2
đối tượng phân số được quản lý bởi 2 biến đối tượng
psA và psB
Vùng nhớ A
Vùng nhớ B
Trang 54Giả sử ta thực hiện lệnh:
psA=psB;
hệ thống máy tính sẽ làm việc theo cơ chế “Phân số A
trỏ tới vùng nhớ mà phân số B đang quản lý” Hay
nói cách khác “Vùng nhớ B” bây giờ có 2 biến đối
tượng cùng trỏ tới(cùng quản lý)
Vùng nhớ A
Vùng nhớ B
Trang 55Như vậy đã xuất hiện Alias ở “vùng nhớ B” Lúc
này sẽ xảy ra 2 hiện tượng như sau:
Tại “vùng nhớ B”, nếu psA thay đổi thông tin sẽ làm cho
psB thay đổi thông tin (vì cả 2 đối tượng này cùng quản
lý một vùng nhớ)
“Vùng nhớ A” không còn đối tượng nào tham chiếu tới,
lúc này hệ thống sẽ tự động thu hồi bộ nhớ (hủy vùng
nhớ A đã cấp trước đó), cơ chế này gọi là cơ chế gom rác
tự động
Vùng nhớ A
Vùng nhớ B
Trang 56Đôi khi trong quá trình thực hiện phần mềm ta có
nhu cầu sao chép đối tượng ra (tạo thêm một đối
tượng giống y xì đối tượng cũ nhưng nằm ở ô nhớ
khác, để ta có thể tự do thay đổi thông tin trên đối
tượng sao chép mà không làm ảnh hưởng tới đối
MemberwiseClone để sao chép đối tượng
public PhanSo copy()
{
return this MemberwiseClone() as PhanSo ; }
Trang 57Ví dụ:
psA thay đổi không ảnh hưởng gì tới psB và ngược lại
PhanSo psB = new PhanSo (1,4);
PhanSo psA = psB.copy();
Vùng nhớ A
Vùng nhớ B
Trang 58END