1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng kỹ thuật lập trình chương 5 trường đại học ngoại ngữ tin học tp hcm

97 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Kỹ Thuật Hướng Đối Tượng
Trường học Trường đại học Ngoại ngữ - Tin học TP.HCM (HUFLIT)
Chuyên ngành Kỹ thuật Lập trình
Thể loại Bài giảng
Thành phố TP.HCM
Định dạng
Số trang 97
Dung lượng 1,61 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

KỸ 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 2

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 đặc điểm của OOP

Phương pháp phân tích thiết kế OOP

Kỹ thuật tổ chức code OOP

• Bài tập vận dụng

Trang 3

GIỚI THIỆU OOP

Trang 4

Mô 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 5

Bà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 6

Bà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 7

Bà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 8

Bà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 9

Lậ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 10

Object

Object biểu diễn một đối

tượng trong thế giới thực.

Objectđơn vị cơ bản trong

OOP

• Các Object được đặc trưng

bởi các thuộc tínhphươ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 11

do 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 12

CÁC ĐẶC ĐIỂM CỦA OOP

Trang 13

Cá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

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 20

Properties

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 28

Tí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 35

Tí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 41

Operator 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 46

public 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 52

public 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 58

PHƯƠNG PHÁP PHÂN TÍCH VÀ THIẾT KẾ HƯỚNG ĐỐI TƯỢNG

Trang 59

Phươ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 60

Ví 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 62

Phươ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 63

Phươ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 64

Phươ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 65

Phươ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 66

Phươ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 67

Phươ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 68

Phươ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 69

KỸ 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 72

Tạo lớp

Trang 73

Tạo lớp

Trang 74

Tạo lớp

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace CreatingClass {

class Book {

}

}

Trang 75

Thê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 77

Thê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() {

}

Ngày đăng: 27/07/2023, 08:38

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm