Nội dung • Giới thiệu lập trình hướng đối tượng OOP • Các khái niệm: đối tượng object , thuộc tính attribute/field , phương thức method , lớp class , thực thể instance • Các
Trang 1KỸ THUẬT HƯỚNG ĐỐI TƯỢNG
Khoa Công nghệ thông tin Trường Đại học Ngoại ngữ - Tin học TP.HCM (HUFLIT)
Trang 2Nội dung
• Giới thiệu lập trình hướng đối tượng ( OOP )
• Các khái niệm: đối tượng ( object ), thuộc tính
( attribute/field ), phương thức ( method ), lớp ( class ),
thực thể ( instance )
• Các đặc điểm của OOP
• Phương pháp phân tích và thiết kế OOP
• Kỹ thuật tổ chức code OOP
• Bài tập vận dụng
Trang 3GIỚI THIỆU OOP
Trang 4Mô hình lập trình
thức tổ chức, xây dựng một chương trình máy tính.
• Mỗi ngôn ngữ lập trình sẽ hỗ trợ một hoặc một số mô hình lập trình nhất định.
Trang 5Bài toán ví dụ
• Bài toán quản lý giao dịch của Khách hàng với Ngân hàng
• Khách hàng sẽ có các giao dịch với ngân hàng như:
• Nạp tiền vào tài khoản
• Rút tiền từ tài khoản
• Chuyển khoản giữa các tài khoản
Trang 6Bài toán ví dụ
• Lập trình hướng thủ tục
để giải quyết bài toán:
• Quan tâm đến các chức năng
Trang 7Bài toán ví dụ
• Quản lý quá nhiều chức năng
• Quản lý dữ liệu quá phức tạp
• Khó mở rộng chức năng và sử dụng lại module đã viết
Lập trình hướng đối tượng
Trang 8Bài toán ví dụ
• Lập trình hướng đối tượng
để giải quyết bài toán:
• Chương trình được chia
thành các đối tượng (Object)
• Mỗi Object sẽ có dữ liệu
riêng và các chức năng tương
ứng
• Các Object trao đổi thông tin
với nhau thông qua các
phương thức (chức năng)
Các đối tượng:
Khách hàng , Tiền , Tài khoản
Trang 9Lập trình hướng đối tượng
( Object-Oriented Programming - OOP ):
• Là một mô hình lập trình mà thế giới thực sẽ được mô tả thành một tập các đối tượng (Object) có thể giao tiếp được với nhau.
• Mỗi Object sẽ có những thuộc tính (Attribute/Field) và hành vi (Method) tương ứng.
• Tập hợp các đối tượng giống nhau sẽ được nhóm thành một lớp (Class) Mỗi đối tượng cụ thể của một lớp được gọi là một thực thể (Instance).
Trang 10Object
• Object biểu diễn một đối
tượng trong thế giới thực.
• Object là đơn vị cơ bản trong
OOP
• Các Object được đặc trưng
bởi các thuộc tính và phương
thức
• Thuộc tính ( Attribute/Field )
là dữ liệu lưu trữ các giá trị
đặc trưng của Object
Trang 11do người dùng định nghĩa chứa cả
dữ liệu (Attribute) và các hàm
chức năng (Method) của các
Class
KhachHang
Objects
Trang 12CÁC ĐẶC ĐIỂM CỦA OOP
Trang 13Các đặc điểm của OOP
• Tính đóng gói ( Encapsulation )
• Tính kế thừa ( Inheritance )
Trang 14• Tính đóng gói ( Encapsulation ):
• Giúp đảm bảo tính toàn vẹn của đối tượng bằng việc không
cho phép người sử dụng trực tiếp thay đổi giá trị các thuộc
tính được bảo vệ của đối tượng mà phải thông qua các
phương thức/thuộc tính của đối tượng đó
Tính đóng gói
Trang 15được truy xuất bên trong lớp và
các lớp con (kế thừa) của lớp
Trang 17• Giải pháp “cổ điển”: Tạo method trả về giá trị second
và method gán giá trị cho second.
Properties
class Time
{
private int seconds;
public int Get Seconds()
Trang 19• Một cách cực kỳ “thuận lợi” nhưng không ai dùng
• C# cung cấp 1 giải pháp cho vấn đề này là Property
Trang 20Properties
class Time
{
private int seconds;
public int Seconds
Trang 22• Khai báo property: có 3 phần
• Từ khóa ‘public’: Ai cũng có thể dùng property
• Kiểu của property
… return …;
} set {
… }
}
Trang 23• Tính kế thừa ( Inheritance ):
• Cho phép định nghĩa một đối tượng mới có kế thừa các
thuộc tính và hành vi của đối tượng đã định nghĩa trước đó
Tính kế thừa
Super Class/Base Class
Sub Class/Derived Class
Trang 24• Tính kế thừa ( Inheritance ):
• Super Class/Base Class: Là lớp tổng quát hơn trong mối quan
hệ “is-a”
• Sub Class/Derived Class: Có cùng tập thuộc tính và hành vi
với lớp cơ sở (do kế thừa từ lớp cơ sở), cộng thêm tập thuộc
tính và hành vi của riêng nó
Tính kế thừa
Trang 25• Quy tắc trong kế thừa :
• Lớp con thừa kế tất cả các thành phần của lớp cha
• Lớp con có thể truy xuất các thành phần public và protected
của lớp cha
• Lớp con có thể thêm các thuộc tính, các phương thức mới
• Lớp con có thể ghi đè (overriding) hoặc nạp chồng
(overloading) các phương thức của lớp cha → Tính đa hình.
Tính kế thừa
Trang 26• Tính đa hình ( Polymorphism ):
• Một tác vụ có thể được thực hiện theo nhiều cách khác nhau
gọi là tính đa hình
• Tính đa hình cho phép người lập trình gọi trước một phương
thức của đối tượng Khi thực thi (runtime), chương trình xác
định đối tượng nào gọi phương thức và thực hiện phương
thức tương ứng của đối tượng đó
Tính đa hình
Trang 28Tính đa hình
Trang 30• Từ khóa ‘ virtual ’
• Cho phép lớp dẫn xuất có quyền thay đổi cách phương thức
này làm việc (cài đặt lại)
• Từ khóa này có thể dùng cho
Trang 31• Lớp dẫn xuất : có thể cung cấp một cách cài đặt khác
của phương thức ở lớp cơ sở.
Tính đa hình
Trang 32• Để cài đặt lại phương thức:
• Tạo một hàm giống như lớp cơ sở (copy).
• Thêm từ khóa override trước phương thức.
• Nếu trong lớp cơ sở không có từ khóa virtual trước phương thức
chúng ta muốn override, thì chúng ta không thể override phương
}
}
Trang 34• Để cài đặt lại phương thức:
• Tạo một hàm giống như lớp cơ sở (copy).
• Thêm từ khóa override trước phương thức.
• Nếu trong lớp cơ sở không có từ khóa virtual trước phương thức
chúng ta muốn override, thì chúng ta không thể override phương
}
}
Trang 35Tính đa hình
Car car1 = new Car();
Car car2 = new LandRover();
Car car3 = new Ford();
Car car4 = new Honda();
Move: LandRover (2.0 L engine)
Move: Ford (V engine)
Move: Honda (i-vtec)
Trang 36• Overriding : là hai phương thức cùng tên , cùng tham
con nội dung phương thức có thể được định nghĩa lại.
• Trong lúc thực thi, nếu một đối tượng của lớp con gọi
một phương thức không được override thì phương
thức của lớp cha sẽ được gọi Ngược lại, nếu có
Overriding
Trang 37• Từ khóa “ base ”:
• Truy cập các constructor của lớp cơ sở
• Truy cập các thành viên không private từ lớp cơ sở
• Thông thường ta không cần dùng “ base ” để truy cập
thành viên lớp cơ sở.
Từ khóa “base”
Trang 38• Khi override phương thức, chúng ta có thể dùng base
để truy cập phiên bản gốc của method này.
Trang 39• Overloading : Cho phép định nghĩa các phương thức
cùng tên trong một class nhưng khác nhau kiểu trả
về ; số lượng , thứ tự hoặc kiểu tham số → Các hàm
Overloading
• Khi được gọi, dựa vào
tham số truyền vào,
phương thức tương ứng
sẽ được thực hiện.
Trang 40• Đặt vấn đề:
Operator overloading
class Vector {
public double X { get; set; } public double Y { get; set; }
public Vector( double x, double y) {
Vector v1 = new Vector (1.0, 2.0);
Vector v2 = new Vector (3.0,4.0);
Vector kq = Vector Add(v1, v2);
Cộng 2 vector
Gọi hàm
cộng 2
vector
Vector v1 = new Vector (1.0, 2.0);
Vector v2 = new Vector (3.0,4.0);
Vector kq = v1 + v2;
Có thể viết
????
Operator Overloading
Trang 41Operator overloading
class Vector {
public double X { get; set; } public double Y { get; set; }
public Vector( double x, double y) {
Overload +
Sử dụng operator +
Vector v1 = new Vector (1.0, 2.0);
Vector v2 = new Vector (3.0,4.0);
Vector kq = v1 + v2;
Trang 42• Cú pháp:
• Một ngôi ( unary operator ): ++, , !,
-• Hai ngôi ( binary operator ) Ví dụ: +, -, *, /, %
• Quan hệ ( relational ): ==, !=, >, <, >=, <=
Operator overloading
42
class Vector {
Kiểu dữ liệu trả về
Toán
Trang 43• Ví dụ:
Toán tử một ngôi (unary operator)
class Vector {
public double X { get; set; } public double Y { get; set; }
public Vector( double x, double y) {
Trang 44• Ví dụ:
Toán tử hai ngôi (binary operator)
class Vector {
public double X { get; set; } public double Y { get; set; }
public Vector( double x, double y) {
Vector v1 = new Vector (1.0, 2.0);
Vector v2 = new Vector (3.0,4.0);
Trang 45• Ví dụ:
Toán tử quan hệ (relational operator)
class Vector
{ public double X { get; set; } public double Y { get; set; }
public Vector ( double x, double y) {
Vector v1 = new Vector (1.0, 2.0);
Vector v2 = new Vector (3.0,4.0);
if(a == b)
So sánh bằng
So sánh
không bằng
Sử dụng toán tử so sánh
Trang 46public double X { get; set; }
public double Y { get; set; }
public Vector( double x, double y) {
Trang 47• Ưu điểm của Operator overloading:
• Viết code ngắn gọn hơn
• Code dễ đọc hơn
• Vận dụng được các kiến thức về toán tử số học (+, -, *, /, >, <)
hiện có của người dùng
Ưu điểm của operator overloading
Vector a = new Vector (1.0, 2.0);
Vector b = new Vector (3.0,4.0);
Vector c = a + b;
Vector d = Vector.Add(a,b);
operator
method
Trang 48• Các toán tử có thể overload
• Các toán tử số học : +, -, *, /, %
• Các toán tử qua hệ: ==, !=; >, <; >=, <=
• Các toán tử không overload được
• += , -= , *= , /= , %= (Nhưng khi overload toán tử + thì C# sẽ
tự động overload phép toán +=,…)
• &&, ||
• =, , new
• Không thể tạo phép toán mới
Nhược điểm của operator overloading
Trang 49• Ví dụ:
Nhược điểm của operator overloading
class Vector {
public double X { get; set; }
public double Y { get; set; }
public Vector( double x, double y) {
Vector v1 = new Vector (1.0, 2.0);
Vector v2 = new Vector (3.0,4.0);
Trang 50• Trong C#, có thể overload các toán tử chuyển đổi.
• Chỉ thực thi trên lớp do người dùng tự định nghĩa
Trang 51• Nhược điểm của overload toán tử chuyển đổi:
• Phải có public static
• Chỉ có thể truyền một tham số đầu vào
• Không thể truyền tham chiếu cho các biến (không dùng
được từ khoá ref, out)
Các toán tử chuyển đổi (conversion operators)
Trang 52public int TuSo { get; set; }
public int MauSo { get; set; }
bắt
buộc
bắt buộc Chọn 1 trong 2 buộc bắt
Kiểu dữ liệu trả về
Tham số cần chuyển đổi
Trang 53• Chuyển đổi không tường minh (Implicit Converter)
Các toán tử chuyển đổi (conversion operators)
class PhanSo
{
public int TuSo { get ; set ; }
public int MauSo { get ; set ; }
public PhanSo ( int a, int b)
Trang 54• Chuyển đổi tường minh (explicit Converter)
Các toán tử chuyển đổi (conversion operators)
class PhanSo
{
public int TuSo { get ; set ; }
public int MauSo { get ; set ; }
public PhanSo ( int a, int b)
Trang 55• Khi một phương thức trong lớp cơ sở không làm gì cả,
viết hàm này như thế nào?
• Cung cấp cài đặt giả cho phương thức (dummy
implementation)
• Không cài đặt phương thức (dùng từ khóa abstract)
• Thêm từ khóa abstract trước lớp
• Thêm từ khóa abstract trước phương thức không cài đặt
Trang 56• Lớp có chứa phương thức abstract thì bắt buộc phải
khai báo lớp đó là lớp abstract.
• Khi lớp là abstract, thì không thể tạo đối tượng từ lớp
đó (chúng ta cần tạo đối tượng của các lớp dẫn xuất
không trừu tượng).
Abstract method
Car car1 = new Car(); // error
Car car2 = new LandRover();
Car car3 = new Ford();
Car car4 = new Honda();
Trang 57• Lớp trừu tượng có thể có các virtual method, method
thông thường khác.
• Trong lớp dẫn xuất, để cài đặt abstract method ,
chúng ta vẫn dùng từ khóa “ override ”.
• override:
• override cho virtual method
• override cho abstract method
Abstract method
Trang 58PHƯƠNG PHÁP PHÂN TÍCH VÀ THIẾT KẾ HƯỚNG ĐỐI TƯỢNG
Trang 59Phương pháp phân tích và thiết kế HĐT
• Phân tích: ngôn ngữ đặc tả mô hình UML
• Thiết kế: dựa trên các mô hình phân tích, cài đặt ứng
dụng/chương trình theo một ngôn ngữ lập trình hướng đối
tượng
• Các bước phân tích thiết kế hướng đối tượng:
• Bước 1: Phân tích bài toán và trích chọn các đối tượng.
• Bước 2: Xác định mối quan hệ giữa các đối tượng.
• Bước 3: Mô hình hóa lớp các đối tượng.
• Bước 4: Xây dựng các lớp đối tượng bằng ngôn ngữ OOP.
Trang 60Ví dụ: Xây dựng chương trình trò chơi xúc xắc với cách
chơi như sau:
• Mỗi xúc xắc sẽ có giá trị ngẫu nhiên từ 1 đến 6.
• Quy định số lần gieo xúc xắc.
• Hai người lần lượt gieo 1 hạt xúc xắc.
• Sau mỗi lượt gieo, số điểm của lượt đó được tích lũy
vào số điểm của người chơi tương ứng.
• Sau các lượt gieo theo quy định, người thắng cuộc là
người có tổng số điểm lớn hơn.
Phương pháp phân tích và thiết kế HĐT
Trang 61• Bước 1: Xác định các đối tượng:
Phương pháp phân tích và thiết kế HĐT
Trận đấu
Trang 62Phương pháp phân tích và thiết kế HĐT
• Bước 2: Xác định mối quan hệ giữa các đối tượng:
Trang 63Phương pháp phân tích và thiết kế HĐT
• Bước 3: Mô hình hóa lớp các đối tượng (các field và
các method).
• Xúc xắc (XucXac)
• Thuộc tính: giá trị của mặt (giaTri)
• Phương thức: sinh ngẫu nhiên giá trị mặt của xúc xắc (SinhGiaTri())
• Người chơi (NguoiChoi)
• Thuộc tính: tên (ten), điểm (diem)
• Phương thức: gieo xúc xắc (GieoXucXac())
• Trận đấu (TranDau)
• Thuộc tính: xúc xắc (xucXac), 2 người chơi (nguoiChoi), số vòng chơi
(soVong), người thắng cuộc (nguoiThang)
• Phương thức: bắt đầu (BatDau()), kết thúc (KetThuc), hiển thị thông
tin (HienThi()), thực hiện trận đấu (ThucHienTranDau())
Trang 64Phương pháp phân tích và thiết kế HĐT
private int giaTri;
//Định nghĩa Constructor và Property get, set
//tại đây …
public void SinhGiaTri()
{
Random random = new Random ();
this giaTri = random.Next(1, 7);
}
• Bước 4: Xây dựng các lớp đối tượng bằng ngôn ngữ
OOP
Trang 65Phương pháp phân tích và thiết kế HĐT
private String ten;
private int diem;
//Định nghĩa constructor, property get, set
this.diem += xucXac.GiaTri; //get giá trị xucXac
Console Write( " - Diem hien tai = " + this.diem);
}
Trang 66Phương pháp phân tích và thiết kế HĐT
private XucXac xucXac;
private NguoiChoi nguoiChoi1;
private NguoiChoi nguoiChoi2;
private NguoiChoi nguoiThang;
private int soVong;
//Định nghĩa constructor, property get, set tại đây
public void BatDau()
{
Console WriteLine( "Tran dau bat dau " );
for ( int i = 1; i <= this soVong; i++) {
Console WriteLine( "***** Vong {0} *****" , i);
Console WriteLine(nguoiChoi1 Ten + " gieo xuc xac" );
nguoiChoi1.GieoXucXac(xucXac);
Console WriteLine(nguoiChoi2 Ten + " gieo xuc xac" );
nguoiChoi2.GieoXucXac(xucXac);
} }
Trang 67Phương pháp phân tích và thiết kế HĐT
public void KetThuc()
{
int diem1 = nguoiChoi1 Diem ;
int diem2 = nguoiChoi2 Diem ;
if (diem1 > diem2)
this nguoiThang = this nguoiChoi1;
else if (diem2 > diem1)
this nguoiThang = this nguoiChoi2;
}
Trang 68Phương pháp phân tích và thiết kế HĐT
public void HienThi()
{
Console WriteLine( "*** Ket qua tran dau ***" );
Console WriteLine( "- Diem cua {0} : {1} " , nguoiChoi1 Ten ,
Trang 69KỸ THUẬT TỔ CHỨC CODE OOP
Trang 70// Khai báo biến (Fields)
[access modifier] <type> VarName;
Trang 71• Ví dụ: Tạo lớp Book để mô hình quyển sách
• Trong Visual Studio
• Click phải lên tên Project
• Chọn Add → Class …
• Nhập tên lớp: Book
Tạo lớp
Trang 72Tạo lớp
Trang 73Tạo lớp
Trang 74Tạo lớp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CreatingClass {
class Book {
}
}
Trang 75Thêm các Attribute (Field)
• Giả sử lớp Book chứa các thông tin: tựa sách, tác giả, số trang,
số từ
namespace CreatingClass {
class Book {
private string title;
private string author;
private int pages;
private int wordCount;
} }
Trang 76• Cho biết cách tạo đối tượng:
• Xem xét lại các field: Khi đối tượng tạo ra, field nên có giá trị
gì thì hợp lý?
• Ví dụ:
• Khi tạo 1 quyển sách mà không có title được không?
• Khi tạo 1 quyển sách, phần lớn một quyển sách có thông tin thông
thường gì?
• Khi tạo 1 quyển sách, chúng ta muốn cung cấp đầy đủ thông tin
không?
Thêm các constructors
Trang 77Thêm các constructors
namespace CreatingClass
{
class Book {
private string title;
private string author;
private int pages;
private int wordCount;
public Book(string title) {
this.title = title;
}
} }
Trang 78• Giải thích:
• public access modifier: Muốn người ngoài lớp có thể tạo đối
tượng Book
• Constructor giống method, nhưng có 2 khác biệt:
• Tên constructor giống tên lớp (Book)
• Không có kiểu trả về
• Nếu không viết constructor thì trình biên dịch sẽ tạo cho
chúng ta constructor không tham số
Thêm các constructors
public Book() {
}