1

Chapter 9 – Object­Based Programming

Outline

Introduction Implementing a Time Abstract Data Type with a Class Class Scope Controlling Access to Members Initializing Class Objects: Constructors Using Overloaded Constructors Properties Composition: Objects as Instance Variables of Other Classes Using the this Reference Garbage Collection static Class Members const and readonly Members Indexers Data Abstraction and Information Hiding Software Reusability Namespaces and Assemblies Class View and Object Browser

Interface

2

• Class và Object • Object­Oriented Programming (OOP). • Abstraction – Trừu Tượng • Encapsulation – Đóng Gói • Inheritance – Kế Thừa • Polymorphism – Đa Hình

Giới Thiệu

3

ố ượ ớ Class and Object (L p và đ i t ng)

ộ ớ ể ượ ị ữ ệ c đ nh

ự ươ

• Class (L p) th c ch t là m t ki u d  li u đ ấ ng trình. ộ ẫ

ố ượ

• Class đ c tr ng cho m t m u, nh ng nét chung nh t  ấ ữ ả ấ   c u  trúc  bên  trong  ng  và  mô  t . nghĩa trong ch ư ặ ộ ủ c a  m t  vài  đ i  t ố ượ ữ ủ c a nh ng đ i t

ượ ạ ữ c g i là nh ng  c  t o

ượ ng  này  đ ệ ự c th c hi n.

ươ ủ ữ ng này • Th  hi n ( ể ệ instance) c a m t l p đ ộ ớ ủ ố ượ ữ ố ượ object).  Nh ng  đ i  t ng  ( đ i  t ượ ớ ộ ng trình đ trong b  nh  khi ch • Nh ng  đ i  t ộ ố ượ ng  c a  cùng  m t  class  có  cùng  đ nh

ữ ệ ủ ề ị ấ nghĩa v  các thao tác và c u trúc d  li u c a chúng

4

ClassName

- Properties

+ Methods

ố ượ ớ Class and Object (L p và đ i t ng)

5

Class and Object

ng (Abstraction)

ệ ộ ộ ố ượ

Ca sĩ là 1 class

C m Ly

là m t ca sĩ (Object)

Th i gian

là 1 class

Gi

vào l p

ớ  là th i gian (Object)

Gi

ra ch i

ơ  là th i gian (Object)

• Class : là m t khái ni m tr u t ừ ượ • Object: là m t đ i t ậ ng th t • Ví D :ụ

6

Class CaSi

Class Time

Property

Property

SoBaiHat KieuToc GiongHat

Giờ Phút Giây

Method

Method

Sub DonCa Sub TrinhDien Function KyTenLuuNiem

SetTime UniversalString  ToString

Event

Event

KhatNuoc

Class and Object

7

ố ượ ớ Class and Object (L p và đ i t ng)

System.Window.Form

System

Console

MessageBox

Propertes

Propertes

+ Write(…)

+ Show(…)

+ Writeline(…)

+ …

+ ReadLine()

Form

+ …

Math

- Text

- PI

- Name …

- E

+ Close()

+ Pow(…)

+ Hide()

+ Sqrt(…)

+ Show()

+ Sin(…)

+ …

+…

8

• Object­Oriented Programming (OOP). • Abstraction – Trừu Tượng • Encapsulation – Đóng Gói • Inheritance – Kế Thừa • Polymorphism – Đa Hình

Giới Thiệu

9

Object­Oriented Programming (OOP)  ­ Abstraction

ươ

• Mô hình c a m t đ i t ủ ể

ng th c (

Reality

Abstraction

ộ ố ượ – Đ c đi m (Characteristics)  – Hành vi (Behaviors)  Ph ị ượ ng đ c xác đ nh qua:  Thu c tính ( ộ properties) ứ methods)

Object-Oriented Programming Object-Oriented Programming

10

OOP Terminology­Encapsulation

ớ ủ

ể  cùng v i các  ặ đ c đi m ộ ọ ượ ố ượ ng  đ hành  c  g i  là  m t  gói

• S  ự k t h p ế ợ  c a các  ộ ủ vi  c a  m t  đ i  t (package). • Data hiding

ủ ụ ị ẩ ể

ộ ườ ậ ươ ề ẵ ớ ứ – Thu c tính và các th  t c b   n. – Ng ph i l p trình đi u khi n các thu c tính và các  i các đ i t ng th c có s n t ộ ố ượ ng khác.

– Khai báo là private

11

OOP Terminology­Inheritance

i.

ộ ớ ớ ả ớ ồ ạ ố

ế ượ ớ ọ ượ ừ ể c  g i  là  l p  đ c  th a  k   đ c  chuy n • L p  đ ớ

• Có kh  năng t o ra m t l p m i t ồ ạ ớ ừ ớ ạ  l p đã t n t • L p t n t ơ ớ ọ ượ c g i là l p c   i (original – l p g c) đ s  (ở base), superclass, hay l p cha ( parent) ượ ớ  (child) giao (derived), subclass, hay l p con ớ ớ ủ ớ ộ • L p con có m t quan h ệ “is a” v i l p cha c a nó.

12

OOP Terminology­Inheritance

namespace OOP

{

public partial class frmOOP_Programing : Form

{

. . .

13

OOP Terminology­Inheritance

ả • S   th a  k   ự ừ ử ế (Inheritance)  h   tr   kh   năng  tái  s   ỗ ợ

d ng ụ (reusability)

ộ ố ượ ủ ộ ng và

ề • Reusability – t o ra m t hàm c a m t đ i t ạ ể ượ ử ụ hàm này có th  đ c s  d ng cho nhi u projects

14

OOP Terminology ­ Polymorphism

• Là  nh ng  ph ữ ng  th c  (Methods)  có  cùng  tên

ữ ươ ệ ứ nh ng th c hi n nh ng công vi c khác nhau.

ự ng  th c  ư • Ph ượ t

ươ

• Cho phép m t l p có m t hay nhi u ph ề ố ố ộ ớ ư

ệ ư ứ Select  thì  khác  nhau  cho  các  đ i ố ươ ng nh  radio buttons, check boxes, và list boxes ứ ộ ng th c  cùng  tên  nh ng  danh  sách  các  đ i  s   (argument  lists) thì khác nhau.

Polymorphism is the ability to take on Polymorphism is the ability to take on many shapes or forms. many shapes or forms.

15

ớ ơ ở ậ class <Đ nh danh l p> [: L p c  s ]

ổ [Thu c tính b  sung truy c p]  {

ủ ớ

ồ ộ

Class Members

ng th c (method) ộ

ị ị ị

1. Đ nh nghĩa các thu c tính (property) ươ 2. Đ nh nghĩa ph 3. Đ nh nghĩa hành đ ng (event) >

}

ủ ớ

ườ

ươ

ớ  chính là tên c a l p do ng

ự i xây d ng ch

ng trình

• Đ nh danh l p

ẽ ế ừ ể

ng s  k  th a đ  phát tri n.

ủ ớ

c đ nh nghĩa bên trong thân c a l p,

ị ạ t o ra.  • L p c  s ớ ớ ơ ở là l p mà đ i t • T t c  các thành viên c a l p đ ấ ả ầ

ẽ ượ

ọ ở

ph n thân này s  đ

• Thu c tính b  sung truy c p ổ

ố ượ ủ ớ ượ ị c bao b c b i hai d u ({}). ậ Access modifier:

ớ ơ ở

ặ ị

– public, protected, internal, protected internal, private ế ớ

ể ữ ệ

ế

• N u ko khai báo l p c  s  thì C# m c đ nh xem l p c  s  là object ớ ơ ở • L p luôn là ki u d  li u tham chi u trong C#

ớ Khai Báo L p ­ Declaration  Class

16

ế ế ớ Thi t k  l p

• Thêm class m i vào project:  ớ public class TenLop Project < Add

Class,…

{

// khai báo các thuộc tính (property)

// khai báo các phương thức khởi tạo (constructor)

// khai báo các phương thức truy cập thuộc tính

// khai báo các phương thức khác

}

17

Controlling Access to Member (p 294)

ớ ạ

(Thu c tính gi

ậ ) i h n truy c p

• Public: Nh ng thành viên đ ữ

c dùng

ở ấ b i b t kì các ph

ng th c c a l p bao g m nh ng l p khác. ượ

ể ượ c đánh d u public có th  đ ồ ớ ữ c đánh d u là

private thì

ỉ ượ

ươ • Private: Thành viên trong m t l p A đ c truy c p b i các ph

ch  đ

ượ ứ ủ ớ ộ ớ ươ ớ

c đánh d u là

ậ • Protected: Thành viên trong l p A đ ươ

ươ

ấ ứ ủ ớ ng th c c a l p A. ượ ớ ng th c bên trong l p A và nh ng ph

protected thì  ng th c

ứ ậ

c các ph ấ ừ ớ

l p A truy c p.

ượ

c  đánh  d u  là  ứ ủ ấ ứ ớ

ấ internal  thì  ng th c c a b t c  l p nào trong

ỉ ượ ch  đ ẫ d n xu t t ớ Internal:  Thành  viên  trong  l p  A  đ ở ươ ữ ậ ượ đ c truy c p b i nh ng ph ữ ớ ố ợ cùng kh i h p ng  v i A.

ượ

ươ

c  truy  c p  b i  các  ph

ấ ứ ớ

• Protected  internal:  Thành  viên  trong  l p  A  đ ượ ứ ủ ớ ữ ủ

c  đánh  d u  là  ậ ở ứ ủ ớ protected  internal  đ ng  th c  c a  l p  ẫ ươ ấ ủ A, các ph ng th c c a l p d n xu t c a A, và b t c  l p nào  ố ợ trong cùng kh i h p ng  c a A.

18

ế ế ớ Thi t k  l p (tt)

CHinhCN

- ChieuDai

- ChieuRong

- DienTich

- ChuVi

 Các thuộc tính nên được cung cấp chế độ an toàn dữ liệu nên được khai báo thuộc tính truy cập là private (nguyên tắc đóng gói)

 Phương thức được khai báo thuộc tính truy cập là public

• Ví dụ

19

ế ế ớ Thi t k  l p (tt)

• Ví dụ

CHinhCN

private double mDai;

private double mRong;

// methods

public double ChuVi()

public double DienTich()

20

ố ượ ố ượ ạ ạ T o đ i t T o đ i t ng ng

• Khai báo

Tên đối tượng

Tên lớp

HocSinh hs ;

– Trong thân l pớ ố

hs

• Gi ng nh  thu c tính ộ ư ứ ươ ng th c ự ư ế  nh  bi n

– Trong thân ph ng t

• T ươ • Kh i t o ở ạ – B ng l nh new ệ ằ

Tạo đối tượng

Ten_Lop object;

hs = new HocSinh();

object = new Ten_Lop (arg1, Arg2, …);

hs

20

21

ố ượ ố ượ ạ ạ T o đ i t T o đ i t ng ng

Ten_Lop object = new Ten_Lop (arg1, argu2, …);

22

ế ế ớ Thi t k  l p (tt)

CHinhCN

private double mDai;

private double mRong;

// constructors

public CHinhCN()

public CHinhCN (double d, double r)

// other methods

public double ChuVi()

public double DienTich()

23

ế ế ớ Thi t k  l p (tt)

24

ế ế ớ Thi t k  l p (tt)

25

ử ụ ớ S  d ng l p (tt)

ấ ả ứ ượ ng th c đ c khai báo trong

class s  có ẽ

ươ class. ế ươ ứ • T t c  các bi n, ph ế ạ ph m vi  • Trong  m t ộ class,  các  bi n  và  ph ể ng  th c  có  th

ủ ử ụ s  d ng b ng cách g i tên c a chúng.

ứ ọ ằ • Bên ngoài class, các ph ng th c trong

ươ ế ự ả class không  ế ử c g i tên tr c ti p mà ph i tham chi u s

ể ượ th  đ ụ d ng toán t

ọ ử (.):   ố ượ ươ ứ .< tên_ph ng_th c>

26

Property Property

• Getter/Setter là các ph ng th c:

ị ủ ấ ứ ng  cung  c p  giá  tr   c a

ộ ươ – Getter:  Cho  phép  đ i  t ố ượ thu c tính ra bên ngoài

ị ủ ổ

ể ộ ộ ủ ố ượ m t cách có ki m soát – Setter:  Cho  phép  bên  ngoài  thay  đ i  giá  tr   c a  ng thu c tính c a đ i t

• Property:

ượ ế ể ổ – Đ c  b   sung  vào  C#  đ   thay  th   cách  dùng

26

ề ố getter/setter truy n th ng

27

Creating Properties in a Class

private dataType ClassVariable public dataType PropertyName {

get

{ return ClassVariable; } set {

ClassVariable = value;

} }

28

Creating Properties in a Class (p 305)

private int year; public int Year {

get

{

return year;

}

set

{

year =value ;

}

}

29

Creating Properties in a Class (p 395)

private int year; public int Year {

get

{

return year;

}

private set

{

.

year =value ;

}

Nh ng ng

ườ ở i

bên ngoài không th  can thi p

}

ế

vào các bi n private này

30

Property – Ví dụ Property – Ví dụ

• Đ t v n đ   ề ặ ấ ớ ộ ể

ị ủ ớ i 10 0 t

ị ủ

ả ừ ổ ị ể ấ ư ỉ – L p HocSinh có thu c tính diemVan (đi m văn) – Giá tr  c a diemVan ph i t – Bên ngoài có th  th y và đ i giá tr  c a diemVan – Ch   cho  phép  đ a  giá  tr   m i  (diemMoi)  vào

30

ị ớ ế ớ ớ ợ ệ ừ diemVan n u giá tr  m i là h p l i 10) 0 t (t

31

Property Property

• Dùng getter/setter

class HocSinh { protected double diemVan=0; //… public double GetDiemVan() { return diemVan; } public void SetDiemVan( double diemMoi) { if (0<=diemMoi&&diemMoi<=10) diemVan=diemMoi; } }

31

32

Property Property

ặ ằ

• Cài đ t b ng property

class HocSinh { protected double diemVan=0; //… public double DiemVan { get { return diemVan; } set { if (0 <= value && value <= 10) diemVan = value; } } }

32

33

Property Property

ử ụ • S  d ng property

class Tester

{

HocSinh hs1 = new HocSinh(“Nguyen Ha My Tien”);

hs1.DiemVan = 5;

HocSinh hs2 = new HocSinh(“Nguyen Ha Thanh Tung”);

hs2.DiemVan = hs1.DiemVan;

}

33

setset getget

34

Indexer Indexer

• Cho phép truy c p ậ ậ

ể ữ ệ ủ

–  T o Property v i tên “this” – Khai báo ki u d  li u c a ch   ỉ

m cụ ử ụ

ợ ủ ố ả M ng/T p h p c a đ i  ượ ố ng thông qua tên đ i  t ỉ ụ ượ ng và ch  m c. t • Đ  t o Indexer: ể ạ ớ ạ

ể ọ

– Dùng ký hi u m ng đ  đ c/ghi

giá tr  ị

34

• S  d ng Indexer: ả

35

Using the this reference

ằ ả ng có th  tham kh o chính nó b ng

ể • M i đ i t ỗ ố ượ ử ụ cách s  d ng t ượ ng  đ • Th ừ c  s   d ng  đ   phân  bi

ể  khóa  this ử ụ ứ ữ ệ t  gi a  các  ể ệ ủ ế ng th c và các bi n th  hi n c a

ườ ế ủ bi n c a ph ộ ố ượ m t đ i t ươ ng.

36

Figure 9.4

using System; public class Time4 {

private int hour; // 0-23 private int minute; // 0-59 private int second; // 0-59

// constructor

public Time4( int hour, int minute, int second ) {

this.hour = hour; this.minute = minute; this.second = second;

}

// create string using this and implicit references

public string BuildString() {

return "this.ToStandardString(): " + this.ToStandardString() + "\nToStandardString(): " +

ToStandardString(); }

37

37

Ví dụVí dụ

38

38

Ví dụVí dụ

39

39

Multiple Indexer Multiple Indexer

40

Up­cast và down­cast Up­cast và down­cast

handle con lên handle cha

đ ng (implicit)

ố  handle cha xu ng handle con

– Ép ki u t ể ừ – Luôn thành công – Th c hi n t ệ ự ộ ự • Down­cast – Ép ki u t ể ừ – Tùy tr ườ ng h p – Ph i ch  đ nh rõ (explicit) ị ỉ

40

• Up­cast

41

ụ ụVí d  up­cast Ví d  up­cast

HocSinh HocSinh

HocSinh hs = new HocSinhVan(); HocSinhVan là lớp con của HocSinh

HocSinhVan HocSinhVan

HocSinhVan hsv = new HocSinhVan(); Object o = hsv; HocSinhVan là lớp con (gián tiếp) của Object

HinhHoc HinhHoc

HinhChuNhat HinhChuNhat

HinhHoc hh = new HinhVuong(); HinhVuong là lớp con của HinhChuNhat HinhChuNhat là lớp con của HinhHoc

HinhVuong HinhVuong

41

42

ụ ụVí d  down­cast Ví d  down­cast

((HinhVuong)hh).Width = 8;

Được vì handle hh đang giữ một đối tượng HinhVuong

((HinhChuNhat)hh).Width = 8;

Được vì handle hh đang giữ một đối tượng HinhVuong, mà lớp HinhChuNhat là cha của lớp HinhVuong

((HinhChuNhat)o).Width = 8;

Không được vì handle o đang giữ một đối tượng HocSinhVan, mà lớp HocSinhVan và lớp HinhChuNhat không có quan hệ cha-con  cần có user-defined cast

42

43

ể ể ướ ướ Ki m tra tr Ki m tra tr c khi down­cast c khi down­cast

ể ả ả

ả ợ • Đ  đ m b o down­cast thành công, c n ki m tra  ể ầ ng phù h p ữ ố ượ  đ i t

ừ xem handle có ph i đang gi hay không • T  khóa: is

if (o is HinhChuNhat) ((HinhChuNhat)o).Width = 8; else Console.WriteLine("o khong la HinhChuNhat");

43

44

Garbage Collection (p 307)

ớ ộ

ữ ử ụ ng  không  còn  s   d ng  n a  thì

ớ ư ừ

ượ ươ ạ

• Toán t ấ  ự new c p phát b  nh • Khi  nh ng  đ i  t ố ượ ữ ư CLR đ a vào garbage collection • Garbage collection giúp gi m b t ô nh  d  th a (khi  ớ ả ớ ộ t quá b  nh  cho phép thì các  ể ượ ử ụ c s  d ng) ồ ệ ả

ng trình ch y v ch ớ ư ừ ô nh  d  th a này có th  đ • Vi c  c p  phát  và  gi ấ ư ề ượ ở i  phóng  các  ngu n  tài  nguyên  khác  nh   database  connections,  file  access,  etc  ph i  ườ ậ đ ể c đi u khi n b i ng i l p trình.

45

Garbage Collection (p 307)

• S   d ng  t ừ ử ụ ể khóa    ả ồ finalizers  cùng  v i  garbage  ộ i  phóng  ngu n  tài  nguyên  và  b

ớ ủ ồ • Tr c  khi  garbage  collector  thu  h i vùng nh   c a

ọ ng, nó g i object’s finalizer

ấ ộ ượ • M i l p ch  có duy nh t m t finalizer (đ ọ c g i là

• Tên c a  m t destructor là    ộ ~  character, theo sau là

collector  đ   gi nh .ớ ướ ộ ố ượ m t đ i t ỉ ỗ ớ destructor) ủ tên l pớ

ấ ỳ ố • Destructors không nh n b t k  tham s  nào. ậ

46

Garbage Collection (p 307)

~Class1() {

// do something

} //================================== Class1.Finalize() {

// do something base.Finalize();

}

47

static Class Members (p 308)

ộ ả ủ • M i đ i t

ể ệ

ộ ớ ủ ỗ ố ượ ng c a m t l p có m t b n sao c a  ế ấ ả t c  các bi n th  hi n.  chính nó cho t • Đôi khi nó h u d ng khi t ụ ữ

ể ệ ủ t c  các th  hi n c a  ế ộ ớ ả m t l p dùng chung b n sao c a m t bi n.

ế ử ụ

• Khai báo các bi n s  d ng t ủ ộ ể ạ ạ ả ấ ấ ả ủ ộ ừ  khóa  ế

static đ  t o  duy  nh t  m t  b n  sao  c a  bi n  vào  lúc  ch y  (shared by all objects of the type)

ể ượ ạ ị • Ph m  vi  có  th   đ c  đ nh  nghĩa  cho static

variables (public, private, etc.)

48

Employee.cs (p 309)

public class Employee {

private string firstName; private string lastName; private static int count; // Employee objects in memory

public Employee( string fName, string lName ) {

firstName = fName; lastName = lName;

++count;

Console.WriteLine( "Employee object constructor: " + firstName + " " + lastName + "; count = " + Count );

} // destructor decrements static Employee count ~Employee() {

--count;

Console.WriteLine( "Employee object destructor: " + firstName + " " + lastName + "; count = " + Count );

}

49

Constructor Constructor

ố ượ ạ đ ng khi t o đ i t ng

ố ẽ ượ ạ ặ • Đ c g i t ượ ọ ự ộ • Cùng tên v i l p ớ ớ • Constructor  không  tham  s   s   đ c  t o  m c

ấ ứ ị đ nh khi không có b t c  constructor nào

ể ạ ề

ố ượ ở ạ cách kh i t o đ i t

49

ố • Cho  phép  overload  constructor  đ   t o  ra  nhi u  ng • Static constructor: ko tham s , ko access modifier,

50

ế ủ

ể ệ

ở ạ

• Các Constructors kh i t o th  hi n các bi n c a các đ i  ố

ng.

t

ượ ạ

ử ụ

• N p  ch ng  các  constructors  có  th   đ ể ượ ệ

ể c  s   d ng  đ   ố ở ạ cung c p nhi u cách khác nhau cho vi c kh i t o các đ i  ượ t

ng c a 1 l p.

ấ ả

ề ớ • Ngay  c   khi  constructor  không  t

ng  minh,  t

t  c   các

ườ ở ạ c kh i t o

• N u m t l p không có constructor, constructor m c đ nh

ộ ớ ấ c cung c p

ủ ả ả ượ ầ ữ ệ thành ph n d  li u ph i đ – Ki u s  đ ở ạ ể ố ượ c kh i t o là 0 – Ki u Boolean là false ể – Ki u tham kh o(Reference) là null ể ế ượ đ – Constructor này không có code và các tham s .ố

Initializing Class Objects: Constructors

51

ạ ạ Các Lo i Constructor Các Lo i Constructor

ế

ư

ở ạ

ố ượ

ng) khi ch a bi

t thông tin gì v  nó

ớ ng cùng l p ầ ủ

– Không có tham số – Kh i t o th  hi n (đ i t ể ệ • Constructor sao chép – Tham s   vào là đ i t ố ượ ố – T o ra obj nh  b n sao c a obj đ u vào

ộ ố

ư ả • Constructor khác – Có m t hay nhi u tham s  vào ề ộ – T o obj khi bi ế t m t s  thông tin nào v  nó

51

ặ ị • Constructor m c đ nh

52

Minh h a LopDoiTuongVongTron

Constructor Constructor

Constructor mặc định Constructor mặc định

Constructor sao chép Constructor sao chép

Constructor khác Constructor khác (tạo học sinh khi biết họ tên) (tạo học sinh khi biết họ tên)

class HocSinh { //... public HocSinh() { hoTen = “unknown"; namSinh = 1990; diemVan = diemToan = 0; } public HocSinh(HocSinh hs) { hoTen = hs.hoTen; namSinh = hs.namSinh; diemVan = hs.diemVan; diemToan = hs.diemToan; } public HocSinh(string ht) { hoTen = ht; } }

52

53

Time2.cs

using System; public class Time2 {

private int hour; // 0-23 private int minute; // 0-59 private int second; // 0-59

public Time2() {

SetTime( 0, 0, 0 );

}

public Time2( int hour ) {

SetTime( hour, 0, 0 );

}

public Time2( int hour, int minute ) {

SetTime( hour, minute, 0 );

}

54

TimeTest2.cs

class TimeTest2 { // main entry point for application static void Main( string[] args ) {

Time2 t1, t2, t3, t4, t5, t6;

t1 = new Time2(); // 00:00:00 t2 = new Time2( 2 ); // 02:00:00 t3 = new Time2( 21, 34 ); // 21:34:00 t4 = new Time2( 12, 25, 42 ); // 12:25:42 t5 = new Time2( 27, 74, 99 ); // 00:00:00 t6 = new Time2( t4 ); // 12:25:42

String output = "Constructed with: " +

"\ntime1: all arguments defaulted" + "\n\t" + time1.ToUniversalString() + "\n\t" + time1.ToStandardString();

… }

55

Constructor Constructor

ẽ ạ • Khai báo private cho constructor s  ko cho phép t o

Ko thể tạo thể hiện/obj

55

ố ượ đ i t ng

56

Destructor Destructor

c

ệ ệ ụ ố ượ • Th c hi n nhi m v  “clean” khi đ i t ị ng b

ự h yủ – Trùng tên l p và có d u “~” phía tr ướ – Không có tham s  và access modifier  ố

ỗ ớ

56

• M i l p ch  có 1 destructor ỉ class HocSinh { //... ~HocSinh() { siSo--; } }

57

ủ ụ

Method Method

• Hàm, th  t c khai báo trong class • Hành vi giao ti p v i bên ngoài ế • Static và non static public class CSharp {

{ . . .}

public CSharp ( )  public static void StaticMethod( ) { . . .}

public void NonStaticMethod( ) { . . .} } public class Tester() {

Truy cập qua thể hiện: cs Truy cập qua thể hiện: cs

CSharp cs = new CSharp( ); cs.NonStaticMethod( ); CSharp.StaticMethod( );

}

Truy cập qua tên lớp: CSharp Truy cập qua tên lớp: CSharp

57

58

Đối số

Kiểu trả về

Tên

Method Method

namespace QuanLyHocSinh { class HocSinh { //...

Phần khai báo

static public bool KiemTraDiem( double diem )

{

Phần định nghĩa

bool kq = (0<= diem && diem <= diemToiDa); return kq;

}

} }

Câu lệnh trả kết quả ra ngoài

Các câu lệnh

58

59

Không có đối số

Kiểu trả về

Method Method

namespace QuanLyHocSinh { class HocSinh { //...

public void Xuat( )

{

Console.WriteLine("Ho ten : "+hoTen); Console.WriteLine("Nam sinh : "+namSinh); Console.WriteLine("Diem van : "+diemVan); Console.WriteLine("Diem toan: "+diemToan);

}

Các câu lệnh

} }

59

60

Method ­ overload Method ­ overload

static void ThongBao( double d ) { Console.WriteLine("Day la ThongBao(double)"); } static void ThongBao( int i ) { Console.WriteLine("Day la ThongBao(int)"); } static void ThongBao( int i1, int i2 ) { Console.WriteLine("Day la ThongBao(int, int)"); } static void ThongBao( HocSinh hs ) { Console.WriteLine("Day la ThongBao(HocSinh)"); }

Các phương thức cùng có tên là ThongBao Các phương thức cùng có tên là ThongBao

Các phương có tham số đầu vào khác nhau Các phương có tham số đầu vào khác nhau

60

61

Method ­ overload Method ­ overload

Day la ThongBao(int)

ThongBao(40);

Day la ThongBao(double)

ThongBao(6.8);

Day la ThongBao(HocSinh)

ThongBao(new HocSinh());

Day la ThongBao(int, int)

ThongBao(9,5);

61

Minh h a LopDoiTuongVongTron

62

Method – virtual method Method – virtual method

• Ph

ế

ươ

ể ượ

– M t ph ộ

ự c th c

ng th c c a l p c  s  (l p cha) có th  đ ấ ớ

ở ớ

ứ ả ng th c  o:  ừ  khoá virtual ể ớ ươ – Khai báo t – Cho phép l p con có th  thay th  (override)

thi khác nhau

62

• Đây chính là th c thi tính đa hình ự ứ ủ ớ ơ ở ớ  l p d n xu t (l p con)

63

ươ ứ Ph ng th c đa hình

ừ ươ ứ ủ khóa ng th c c a virtual trong ph

• Khai báo t ớ ơ ở l p c  s .

ớ ẫ ấ ượ ự • Lúc này thì các l p d n xu t đ c t

ả ớ

ử ng th c

ươ ự  do th c thi  các cách x  riêng c a mình trong phiên b n m i  ươ ủ c a ph • thêm t ừ  khóa ủ ứ virtual ể ồ override đ  ch ng lên ph

ứ ả ủ ớ ơ ở ươ ế ồ ồ th c  o c a l p c  s . Sau đó thêm các đo n mã  ớ ngu n m i vào ph ứ ng th c vi ng  ạ t ch ng này

64

Method – virtual method  Method – virtual method

Tên lớp con

Tên lớp cha

class HocSinhVan: HocSinh

{ //... }

class LopCon:LopCha { }

LopCha

HocSinh

LopCon

HocSinhVan

Tạo ra lớp HocSinhVan (học sinh chuyên văn) kế thừa từ lớp HocSinh

64

65

Method – virtual method Method – virtual method

ủ ớ ứ ể ng th c tính đi m trung bình c a l p • Ph

ươ HocSinh class HocSinh

{

//...

public virtual float TinhDiemTrungBinh()

{

float kq = (diemVan + diemToan) / 2;

return kq;

}

}

65

66

Method – virtual method Method – virtual method

ớ ủ ế ạ ể i cách tính đi m

• L p HocSinhVan ph  quy t l ủ ớ trung bình c a l p HocSinh

class HocSinhVan:HocSinh

{

//...

public override double TinhDiemTrungBinh()

{

double kq = (diemVan * 2 + diemToan) / 3;

return kq;

}

}

66

67

VD Polymorphism VD Polymorphism

Phủ quyết hàm Phủ quyết hàm Draw của Shape Draw của Shape

Hàm mới cùng tên Draw với Hàm mới cùng tên Draw với hàm Draw của lớp cơ sở hàm Draw của lớp cơ sở

67

68

Polymorphism Polymorphism

s1 = newnew Shape

Shape();();

Shape draw!

Shape s1 = Shape s1.Draw(); s1.Draw();

Line draw!

s2 = newnew LineLine();();

Shape s2 = Shape s2.Draw(); s2.Draw();

Shape draw!

s3 = newnew Circle

Circle();();

Shape s3 = Shape s3.Draw(); s3.Draw();

Circle draw!

c = (Circle

)s3; Circle)s3;

Circle c = ( Circle c.Draw(); c.Draw();

68

69

const and readonly Members (p 312)

• Declare constant members (members whose value

will never change) using the keyword const

• const members are implicitly static • const members must be initialized when they are

declared

• Use keyword readonly to declare members who  will be initialized in the constructor but not  change after that

70

class Increment {         private readonly int INCREMENT;         private int total = 0;

public Increment(int incrementValue)         {             INCREMENT = incrementValue;         }         public void AddIncrementTolal()         {             total += INCREMENT;

readonly Members (p 312)

}

ậ Bài t p Session4_LD2

71

Abstract class Abstract class

ừ ượ ể ệ ủ ạ ng ko cho phép t o th  hi n c a

ng th c là virtual hay abstract trong l p

• L p tr u t ớ ớ l p đó ử ụ

– khai báo các ph ơ ở ừ ượ c  s  tr u t

ấ ớ

– Override chúng trong l p d n xu t (l p con)

ớ ộ

• S  d ng polymorphism đòi h i  ỏ ươ ng

ẫ • B t c  l p nào có m t ph ớ

ươ ừ ượ ng

71

ấ ứ ớ ả ứ ng th c tr u t ừ ượ ớ thì ph i khai báo l p là l p tr u t ng

72

Abstract class Abstract class

Abstract Method Abstract Method Virtual Method Virtual Method

khoá: abstract ỉ

ế

ầ ừ t  khoá: virtual ự ầ Có  ph n  th c  thi  cho  ở ứ ươ   ng  th c  virtual  ph ơ ở ớ l p c  s

ng th c abstract

ấ ộ

ấ ả ẫ ạ i

c c

72

ứ ở ớ ứ ở ớ ừ t ầ Ch   có  ph n  khai  báo  method  và  k t  thúc  là  ấ d u  “;”,  Không  c n  có  ự ầ thi  cho  th c  ph n  ở ứ ươ   ph ớ l p abstract ộ ớ ắ B t  bu c  l p  d n  xu t  ả ph i override l ừ   khoá  override  tr t ươ ph ướ  l p con ng th c ớ ắ Không  b t  bu c  l p  ẫ d n xu t ph i override ướ ừ   khoá  override  tr t ươ  l p con ph ng th c

73

Abstract class: Abstract class:

public abstract class AbstractClass {

public AbstractClass() { } public abstract int AbstractMethod() ; public virtual int VirtualMethod() { return 0; }

}

73

Abstract class ­ example Abstract class ­ example

74

Abstract class ­ example Abstract class ­ example

Derived class: Derived class:

AbstractClass public class DerivedClass : AbstractClass {

Bắt buộc phải có

override int AbstractMethod()

public DerivedClass() { } public override {

return 0;

override int VirtualMethod()

} public override {

return base.VirtualMethod ();

}

}

74

75

Shape

Point

Circle

Cylinder

Ví dụ

76

Circle

Point

int x,y;

override string Name

double radius; override string Name Diameter(); //dk

Shape abstract  string name; virtual double Area();  virtual double Volume();

Circumference(); //v

override Area();

Circle

Point

Cylinder

int x,y;

override string Name

double height; override string Name

Ví dụ

ườ

ng

double radius; override string Name Diameter(); //đ kính

Circumference(); //chu vi

override Area(); override Volume();

override Area();

77

Shape.cs

Ch  đ nh nghĩa tên  ph

ạ ở i

ự ả Bu c ph i xây d ng l ự ế class con tr c ti p.

4 5 public abstract class Shape 6 { ị ỉ 7 public virtual double Area() ươ ng th c, không x  lý. 9 { 10 return 0; 11 } 12 14 public virtual double Volume() 15 { 16 return 0; 17 } 18 20 public abstract string Name 21 { 22 get; 23 } 24 }

78

Point2.cs

7 public class Point2 : Shape 8 { 9 private int x, y; 10 12 public Point2() { } 18 public Point2( int xValue, int yValue ) 19 { 20 X = xValue; 21 Y = yValue; 22 } 23 25 public int X 26 { 27 get 28 { 29 return x; 30 } 31 32 set 33 { 34 x = value; // no validation needed • } • }

79

Point2. cs

39      public int Y 40      { 41         get    {    return y;    } 45    46         set 47         { 48            y = value; // no validation needed 49         } 50      } 53      public override string ToString() 54      { 55         return "[" + X + ", " + Y + "]"; 56      } 57    58      // implement abstract property Name of class Shape 59      public override string Name 60      { 61         get 62         { 63            return "Point2"; 64         } 65      } 67   } // end class Point2

80

Circle2.cs

6 public class Circle2 : Point2 7 { 8 private double radius; 10 // default constructor 11 public Circle2(){ } 15 16 // constructor 17 public Circle2( int xValue, int yValue, double radiusValue ) 18 : base( xValue, yValue ) 19 { 20 Radius = radiusValue; 21 } 23 // property Radius 24 public double Radius 25 { 26 get 27 { 28 return radius; 29 } 31 set 32 { 34 if ( value >= 0 ) 35 radius = value; 36 } 37 }

81

Circle2.cs

39 // tính bán kính 40 public double Diameter() 41 { 42 return Radius * 2; 43 } 44 45 // Tình chu vi 46 public double Circumference() 47 { 48 return Math.PI * Diameter(); 49 } 50 51 // diện tích 52 public override double Area() 53 { 54 return Math.PI * Math.Pow( Radius, 2 ); 55 } 56 58 public override string ToString() 59 { 60 return "Center = " + base.ToString() + 61 "; Radius = " + Radius; 62 }

82

Circle2.cs

64 // override property Name from class Point2 65 public override string Name 66 { 67 get 68 { 69 return "Circle2"; 70 } 71 } 72 73 } // end class Circle2

83

Cylinder2.cs

5 // Cylinder2 inherits from class Circle2 6 public class Cylinder2 : Circle2 7 { 8 private double height; // Cylinder2 height 11 public Cylinder2() 12 { } 13 // constructor 17 public Cylinder2( int xValue, int yValue, double radiusValue, 18 double heightValue ) : base( xValue, yValue, radiusValue ) 19 { 20 Height = heightValue; 21 } 22 24 public double Height 25 { 26 get 27 { return height; } 30 31 set 32 { 34 if ( value >= 0 ) 35 height = value; 36 37

} }

84

Cylinder2.cs

40 public override double Area() 41 { 42 return 2 * base.Area() + base.Circumference() * Height; 43 } 45 46 public override double Volume() 47 { 48 return base.Area() * Height; 49 } 50 52 public override string ToString() 53 { 54 return base.ToString() + "; Height = " + Height; 55 } 56 58 public override string Name 59 { 60 get 61 { 62 return "Cylinder2"; 63 } 64 } 66 } // end class Cylinder2

85

AbstractShapesTest.cs

6 public class AbstractShapesTest 7 { 8 public static void Main( string[] args ) 9 { 10 Point2 point = new Point2( 7, 11 ); 12 Circle2 circle = new Circle2( 22, 8, 3.5 ); 13 Cylinder2 cylinder = new Cylinder2( 10, 10, 3.3, 10 ); 14 16 Shape[] arrayOfShapes = new Shape[ 3 ]; 17 19 arrayOfShapes[ 0 ] = point; 20 22 arrayOfShapes[ 1 ] = circle; 23 25 arrayOfShapes[ 2 ] = cylinder; 26 27 string output = point.Name + ": " + point + "\n" + 28 circle.Name + ": " + circle + "\n" + 29 cylinder.Name + ": " + cylinder;

86

AbstractShapesTest.cs

33 foreach( Shape shape in arrayOfShapes ) 34 { 35 output += "\n\n" + shape.Name + ": " + shape + 36 "\nArea = " + shape.Area().ToString( "F" ) + 37 "\nVolume = " + shape.Volume().ToString( "F" ); 38 } 39 40 MessageBox.Show( output, "Demonstrating Polymorphism" ); 41 } 42 }

87

Program Output

88

ượ ớ ớ

• Còn g i là l p niêm phong, không cho phép  c v i l p abstract.

ớ ế ừ ớ l p khác k  th a nó, ng

Sealed Class Sealed Class

using System; sealed class MyClass {

public int x; public int y;

} class MainClass {

public static void Main() {

MyClass mC = new MyClass(); mC.x = 110; mC.y = 150; Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);

}

}

88

89

Sealed method Sealed method

using System; class MyClass1 {

Sử dụng sealed trước phương thức để ngăn ko cho lớp dẫn xuất override

public int x; public int y; public virtual void Method() { Console.WriteLine("virtual method"); }

} class MyClass : MyClass1 {

public override sealed void Method() { Console.WriteLine("sealed method"); }

} class MainClass {

public static void Main() {

MyClass1 mC = new MyClass(); mC.x = 110; mC.y = 150; Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y); mC.Method();

}

}

89

90

Nested class Nested class

ựơ ủ ớ ọ • L p đ ớ

ớ ọ

c khai báo bên trong thân c a l p khác g i  là: inner class hay nested class, l p kia g i là outer  class ớ ậ ấ ả ủ ớ ể ộ t c  thành viên c a l p • L p n i có th  truy c p t

ể ớ ớ • L p  n i  n m  trong  l p  ngoài  nên  nó  có  th   là

ể ả ngoài, k  c  private ằ ộ ớ ớ private v i l p ngoài ộ ớ ể

90

ủ ớ • Khi l p n i khai báo là public thì có th  truy xu t  ấ thông qua tên c a l p ngoài: outer_class.inner_class

91

Nested class Nested class

Truy xuất được thành phần Private của lớp outer

Lớp nested class

public class Fraction { private int numerator; private int denominator; public Fraction(int numerator, int denominator) { this.numerator = numerator; this.denominator = denominator; } public override string ToString() {

string str = numerator.ToString() + "/" + denominator.ToString(); return s;

91

} public class FractionArtist { public void Draw(Fraction f) { Console.WriteLine("Drawing the numerator {0}", f.numerator); Console.WriteLine("Drawing the denominator {0}", f.denominator); } } }

92

Nested class Nested class

class Tester { static void Main() { Fraction f1 = new Fraction(3, 4); Console.WriteLine("f1: {0}", f1.ToString()); Fraction.FractionArtist fa = new Fraction.FractionArtist(); fa.Draw(f1); } }

Truy xuất lớp inner qua lớp Truy xuất lớp inner qua lớp outer, lớp outer tương tự outer, lớp outer tương tự như manespace như manespace

92

93

Interface Interface

ứ ư ị • Interface quy đ nh các ch c năng nh ng không

• Ph ả ụ ể  c  th  chúng ứ ng th c trong interface

ị ạ  khóa ph m vi, luôn là  ộ ể ứ

mô t ươ – Ch  khai báo, không đ nh nghĩa ỉ – Không có t

public • Interface không th  ch a thu c tính • T  khóa:  interface

Có thể xem interface như một bản hợp đồng, nếu lớp nào sử dụng (kế thừa) nó thì phải thực thi đầy đủ các mô tả (phương thức) trong hợp đồng (interface)

93

94

Interface Interface

[access modifier] interface [: base interface list]

ể ế ừ ừ

• M t interface có th  k  th a t

ề  nhi u

interface khác

nhi u interface

• M t l p có th  k  th a t ứ

ộ ớ ả ị

ể ế ừ ừ ấ ả ươ t c  ph

– Ph i đ nh nghĩa t

ng th c mà các interface "cha" quy

ự ế ừ

ả ặ

đ nhị ự ế ừ

• S  k  th a interface ph i đ t sau s  k  th a

l pớ

ườ

ượ ặ

ớ ề

ng đ

c đ t tên v i ti n

• Các interface th  là  “I”

94

ố t – IFile, IComparable, IDisposable, IStorable, ICloneable…

95

Interface ­ example Interface ­ example

Khai báo property StudentID Khai báo property StudentID gồm hàm get ,set gồm hàm get ,set

public interface IStudent {

int StudentID {

Khai báo phương thức Khai báo phương thức AddSubject AddSubject

get; set;

} void AddSubject(string subjectName);

}

Phải định nghĩa {get,set} của StudentID và AddSubject ở lớp thực thi interface

95

96

Interface ­ example Interface ­ example

class  Student

: IStudent Student  : IStudent

public  class public {{

Bắt buộc lớp student phải định nghĩa property Student và hàm AddSubject

subjects = nullnull;;

studentID = 0;  private  intint studentID = 0;  private ArrayList subjects =  private  ArrayList      private      {}{}  Student()  public Student()  public  StudentID  public  intint StudentID  public {{

getget { { setset { {

studentID;   } return studentID;   } return value;  };  } studentID = value studentID =

AddSubject(string

subjectName)  string subjectName)

}} public  voidvoid AddSubject( public {{

subjects.Add(subjectName); subjects.Add(subjectName);

}}

}}

96

97

ơ ế

C  ch  Delegate & Event

98

i pháp cho hàm Sort t ng quát

• Delegate – Khái ni m delegate ệ – Th c thi delegate – Multicast delegate – Gi ả • Event

ơ ế

ọ ơ ế

– Khái ni m event ệ – Event & delegate – C  ch  publishing & subscribing – Minh h a c  ch  event

ộ ộN i dung N i dung

99

Delegate Delegate

ớ ứ ươ

ng th c (method signature) ủ

• L p đóng gói các ph • Dùng trong event­handling model c a C# • Đ c tính  ặ – Type safe – Object oriented mechanism

ế

ế

– Có instance – Có th  ch a nh ng tham chi u đ n 1 hay nhi u method ể ứ

• Delegate là class:

100

Delegate Delegate

– Return type – Sequence of parameter types

ộ ộ ị • M t delegate đ nh nghĩa m t signature

ấ ả ể ượ • T t c  các method có cùng signature có th  đ c add

ể ệ ủ vào th  hi n c a delegate

ế • Delegate instance có m t danh sách các tham chi u  ộ

method – Cho phép add (+) các method – Có th  remove (­) các method

101

Define delegate Define delegate

public delegate void MyDelegate1(int x, int y)

Delegate cho dạng hàm: void Method( int, int )

public delegate string MyDelegate2(float f)

Delegate cho dạng hàm: string Method( float )

102

Instance delegate Instance delegate

public void Method1(int x, int y) {

} … MyDelegate1 del1 = new MyDelegate1(Method1);

public string Method2(float f) {

} … MyDelegate2 del2 = new MyDelegate2(Method2);

103

Call Delegate Call Delegate

Gọi del1 Gọi del1

del1(10, 20); del1(10, 20);

int x = 5, y = 10; int x = 5, y = 10; del1(x, y); del1(x, y);

int y = 2; int y = 2; del1(100, y); del1(100, y);

Gọi del2 Gọi del2

string s = del2(100f); string s = del2(100f);

float f =0.5f; float f =0.5f; string s; string s; s = del2(f); s = del2(f);

104

Multi Cast Multi Cast

void Print(int x,int y) { void Print(int x,int y) {

Console.WriteLine(“x = {0}, y = {1}”, x, y); Console.WriteLine(“x = {0}, y = {1}”, x, y);

}} void Sum(int x, int y) { void Sum(int x, int y) {

Console.WriteLine(“Tong = {0}”, x+y); Console.WriteLine(“Tong = {0}”, x+y);

}}

MyDelegate1 mulDel = new MyDelegate1(Print); MyDelegate1 mulDel = new MyDelegate1(Print); mulDel += new MyDelegate1(Sum); mulDel += new MyDelegate1(Sum);

mulDel(5, 10); mulDel(5, 10);

mulDel -= new MyDelegate1(Print); mulDel -= new MyDelegate1(Print); mulDel(5,10); mulDel(5,10);

105

106

Problem Problem

Xây dựng hàm Sort tổng quát cho mảng đối tượng có kiểu bất kỳ

107

ng là ki u s  nh  int, long, float thì ko có v n đ

ố ượ

Solution Solution

ố ượ ợ ng h p đ i t

ể ố ư ứ ng ph c khác?

• Phân tích – N u đ i t ế – Tr ườ

So sánh theo So sánh theo quy tắc nào quy tắc nào

108

Solution Solution

ng t ể

ử ụ

ươ

c a chúng ứ

ả • Gi

ứ ự ủ ng th c so sánh này vào hàm

Sort

i pháp: – Cho phép đ i t ố ượ ị  quy đ nh th  t – S  d ng delegate đ  truy n ph

void Sort(object[] list, CompareObj cmp)

Delegate này sẽ tham chiếu tới hàm Compare của lớp MyClass. Chính lớp MyClass sẽ quy định thứ tự của các đối tượng

109

Solution Solution

ả • Mô t delegate CompareObj cho hàm Sort:

Tên của delegate

public delegate bool CompareObj(object o1,object o2)

Trả về true: nếu o1 “trước” o2

false: ngược lại

2 đối tượng cần so sánh

110

Solution Solution

Định nghĩa hàm Sort tổng quát cho các lớp

Delegate sẽ trỏ tới hàm Delegate sẽ trỏ tới hàm Compare riêng của lớp Compare riêng của lớp tương ứng tương ứng

public static void Sort(object[] objs, CompareObj public static void Sort(object[] objs, CompareObj cmpcmp)) {{

Yêu cầu lớp tự so sánh

i++) for(int i=0; i < objs.Length-1; i++) for(int j=objs.Length-1; j>i; j--) j--) objs[j-1] )) ))

for(int i=0; i < objs.Length-1; for(int j=objs.Length-1; j>i; objs[j], objs[j-1] if (if ( cmpcmp(( objs[j], {{

Swap( objs[j], objs[j-1] ); Swap( objs[j], objs[j-1] );

}}

}}

111

Solution Solution

• Các l p h  tr  Sort thì ph i  ả ỗ ợ – Cung c p hàm Compare riêng – Signature ph i tho  delegate CompareObj ả ả

Cùng Cùng signature signature

CompareName(object p1, object p2)

{ (object p1, object p2) {

class Person {{ class Person private string name; private string name; private int weight; private int weight; private int yearOfBirth; private int yearOfBirth; public static bool CompareName public static bool if (string.Compare(((Person)p1).name, ((Person)p2).name)<0) if (string.Compare(((Person)p1).name, ((Person)p2).name)<0) return true; return true; return false; return false; }} }}

112

Solution Solution

public delegate bool CompareObj(object o1,object o2); …

Person[ ] persons = new Person[4];

persons[0] = new Person(“Quy Mui", 2, 2004); persons[1] = new Person(“Ha Lam", 65, 1978); persons[2] = new Person(“Ngoc Thao", 47, 1979); persons[3] = new Person(“Quoc Trung", 65, 1932);

CompareObj cmp = new CompareObj(Person.CompareName);

Lib.Sort( persons, cmp );

Gọi hàm Sort

Lớp chứa hàm Sort

113

Event Event

114

Event Event

ớ ệ ố ượ

ơ ế ể ng ộ ớ ế ượ t đ c khi m t l p

có phát sinh đi u gì đó ớ ớ ự ệ ậ ả • C  ch  thông đi p gi a các l p hay các đ i t ữ • Có th  thông báo cho l p khác bi ớ ề • Publisher: l p phát sinh s  ki n ự ệ • Subscriber: l p nh n hay x  lý khi s  ki n x y ra ử

115

Event Event

ườ ệ • Trong môi tr ng giao di n GUIs (Graphical User

ự ệ Click”, cho phép l p khác có th  đáp  ng

ự ệ (x  lý) khi s  ki n này x y ra.

Interfaces: GUIs): – Button đ a ra s  ki n “ ư

ệ ấ ữ ệ ừ • VD: Button “Add” trong Form, khi s  ki n click x y  ả ự ệ ư  các TextBox đ a

ự ra thì Form th c hi n l y d  li u t vào ListBox…

116

Publishing & Subscribing Publishing & Subscribing

ầ ử

ộ ớ • M t l p có publish m t t p các event cho phép các  ộ ậ

ủ click” c a Button

ớ kích ho t.ạ

ớ l p khác subscribe – Button là l p publish đ a ra event: click  ư – Form là l p subscribe có ph n x  lý riêng khi “

event event

subscribe subscribe

Thông báo Thông báo

publish publish

BB

Đăng ký Đăng ký

AA

CC

117

Event & Delegate Event & Delegate

ự ượ ờ ỷ • S  ki n trong C# đ

ớ ự ệ

ứ ủ ớ

ượ

ự ươ ng th c c a l p subscribing đ

c

ự ệ ớ

ự ệ ọ ng th c đ  x  lý s  ki n g i là • Ph ự ử trình x  lý s

c th c thi nh  u  thác – L p publishing đ nh nghĩa  y thác ị ủ – Nh ng l p subscribing ph i th c thi ả – Khi s  ki n xu t hi n thì ph ệ ấ ọ ỷ g i thông qua u  thác. ứ ể ử ươ ki nệ  (event handler)

118

Event & Delegate Event & Delegate

ự ệ

ố ượ

ự ệ ử ượ • Trình x  lý s  ki n trong .NET Framework đ c mô

ng

publisher

ố ượ

ộ ớ

ấ ừ

ng thu c l p d n xu t t

ẫ ự ệ

EventArgs ẫ

– Tham s  2ố : là đ i t ự

ả ư t  nh  sau: – Tr  v  giá tr  void ả ề – Tham s  1ố :  ngu n phát sinh s  ki n, đây chính là đ i t ồ

ệ • Ph i th c hi n trình x  lý s  ki n theo đúng m u  ử

ả trên!

119

Event & Delegate Event & Delegate

ử • Khai báo delegate x  lý s  ki n ự ệ

delegate void HandlerName(object obj, EventArgs arg); void HandlerName(object obj, EventArgs arg);

public delegate public

• Khai báo event

public event HandlerName OnEventName;

ự ệ ớ • Các l p mu n x  lý khi s  ki n OnEventName phát

ố ử ự ả sinh thì ph i th c thi event handler

120

Minh h a 1ọ Minh h a 1ọ

ầ ệ ự ẽ ứ ỗ c  m i giây s

ự ệ ử • Cho phép 2 l p khác đăng ký x  lý s  ki n này, m i  ỗ

ỏ ỏ

ể ể

ồ ồ

: hi n th  th i gian theo “ : hi n th  th i gian theo “

ồ mô ph ng đ ng h  analog ” ồ mô ph ng đ ng h  digital ”

• Xây d ng 1 l p th c hi n yêu c u: “ ự ớ ự ệ ” phát sinh 1 s  ki n ớ ử ị ờ ị ờ ớ l p có cách x  lý riêng: – L p Aớ – L p Bớ

121

Minh h a 1ọ Minh h a 1ọ

ự ệ

– Khai báo m t event: OnSecondChange – M t ph ộ

• T o m t l p Clock: ộ ớ ộ ng th c Run: c  1s thì phát sinh s  ki n

ậ ử • T o 2 l p: AnalogClock và DigitalClock nh n x  lý

ứ ươ OnSecondChange ớ ạ ự ệ s  ki n OnSecondChange c a l p Clock

ủ ớ

122

Minh h a 1ọ Minh h a 1ọ

ử • Khai báo delegate x  lý event

Tên delegate xử lý sự kiện Tên delegate xử lý sự kiện

delegate void SecondChangeHandler(object clock, EventArgs info); delegate void SecondChangeHandler(object clock, EventArgs info);

Đối tượng phát sinh event Đối tượng phát sinh event

Tham số kiểu EventArgs Tham số kiểu EventArgs

123

Minh h a 1ọ Minh h a 1ọ

ử ả • Khai báo event có hàm x  lý mô t trên

Kiểu delegate Kiểu delegate

event SecondChangeHandler event

OnSecondChange;; SecondChangeHandler OnSecondChange

Tên của event Tên của event

Từ khóa event: thể hiện cơ chế publishing & subscribing Từ khóa event: thể hiện cơ chế publishing & subscribing

124

Minh h a 1ọ Minh h a 1ọ

• Kích ho t s  ki n ạ ự ệ

Kiểm tra xem có hàm xử lý được đăng ký hay không?

if (OnSecondChange != null) OnSecondChange(this, new EventArgs());

Gọi hàm xử lý sự kiện đã đăng ký

125

Minh h a 1ọ Minh h a 1ọ

public class Clock { public delegate void

SecondChangeHandler(object clock, EventArgs info);

public event SecondChangeHandler OnSecondChange;

public void Run() { while (true) { Thread.Sleep(1000); if (OnSecondChange != null) OnSecondChange(this, new EventArgs()); } } }

126

Minh h a 1ọ Minh h a 1ọ

• Đúng mô t • Th c hi n m t s  thao tác riêng c a DigitalClock ệ ự ử

ự ệ ủ ử  delegate hàm x  lý c a l p Clock ộ ố ớ

ủ ớ ủ ự ệ

ự ệ

– Đăng ký x  lý v i trình x  lý s  ki n trên khi có s  ki n

ự ệ

OnSecondChange c a Clock • Ch c năng đăng ký v i l p Clock là có x  lý khi s  ki n

ớ ớ ủ

ẽ ọ

y thác cho l p Clock s  g i trình x  lý đ nh nghĩa bên trên c a

OnSencondChange c a Clock phát sinh ử Ủ DigitalClock

• L p DigitalClock – Đ nh nghĩa trình x  lý s  ki n c a Clock ử

127

Minh h a 1ọ Minh h a 1ọ

ử • Trình x  lý c a DigitalClock ủ

Đối tượng phát sinh sự kiện

Tên của trình xử lý

public void Show(object obj, EventArgs args) { DateTime date = DateTime.Now; Console.WriteLine("Digital Clock: {0}:{1}:{2}", date.Hour, date.Minute, date.Second);

}

128

Minh h a 1ọ Minh h a 1ọ

• Đăng ký x  lý s  ki n ự ệ ử

Đối tượng này sẽ Đối tượng này sẽ phát sinh sự kiện phát sinh sự kiện

theClock)) public void Subscribe(Clock theClock public void Subscribe(Clock { { theClock.OnSecondChange += theClock.OnSecondChange +=

new Clock.SecondChangeHandler(ShowShow);); new Clock.SecondChangeHandler(

}}

Ủy thác phương thức Show cho Ủy thác phương thức Show cho OnSecondChange OnSecondChange

129

Minh h a 1ọ Minh h a 1ọ

public class DigitalClock { public void Subscribe(Clock theClock) { theClock.OnSecondChange +=

new Clock.SecondChangeHandler(Show);

} public void Show(object obj, EventArgs args) { DateTime date = DateTime.Now; Console.WriteLine("Digital Clock: {0}:{1}:{2}", date.Hour, date.Minute, date.Second);

} }

130

Minh h a 1ọ Minh h a 1ọ

• Đúng mô t • Th c hi n m t s  thao tác riêng c a AnalogClock ệ ự ử

ự ệ ủ ử  delegate hàm x  lý c a l p Clock ộ ố ớ

ủ ớ ủ ự ệ

ự ệ

– Đăng ký x  lý v i trình x  lý s  ki n trên khi có s  ki n

ự ệ

OnSecondChange c a Clock • Ch c năng đăng ký v i l p Clock là có x  lý khi s  ki n

ớ ớ ủ

ẽ ọ

y thác cho l p Clock s  g i trình x  lý đ nh nghĩa bên trên c a

OnSencondChange c a Clock phát sinh ử Ủ AnalogClock

• L p AnalogClock – Đ nh nghĩa trình x  lý s  ki n c a Clock ử

131

Minh h a 1ọ Minh h a 1ọ

public class AnalogClock { public void Subscribe(Clock theClock) { theClock.OnSecondChange +=

new

Clock.SecondChangeHandler(Show); } public void Show(object obj, EventArgs args) { DateTime date = DateTime.Now; Console.WriteLine("Analog Clock: {0}:{1}:{2}",

date.Hour,date.Minute,date.Second);

} }

132

Minh h a 1ọ Minh h a 1ọ

ọ ơ ế • Minh h a c  ch  event

Đăng ký xử lý sự kiện của đối Đăng ký xử lý sự kiện của đối tượng myClock! tượng myClock!

public class Tester { public static void Main() { Clock myClock = new Clock(); AnalogClock c1 = new AnalogClock(); DigitalClock c2 = new DigitalClock(); c1.Subscribe(myClock); c2.Subscribe(myClock); myClock.Run(); } }

Phát sinh sự kiện

133

Minh h a 1ọ Minh h a 1ọ

Được ko? Được ko?

public static void Main( ) { Clock myClock = new Clock(); AnalogClock c1 = new AnalogClock(); DigitalClock c2 = new DigitalClock();

myClock.OnSecondChange += new

Clock.SecondChangeHandler(c1.Show);

myClock.OnSecondChange += new

Clock.SecondChangeHandler(c2.Show);

myClock.Run(); }

134

135

ọ ọ Minh h a EventArgs Minh h a EventArgs

ờ ệ

hi n hành riêng

trùng

ố ừ ớ

– M i l p subscibing ph i l y gi – Nên truy n tham s  t ề

ả ấ ự ệ  l p publishing ngay khi phát sinh s  ki n

(cid:0) • H n ch :  ế ỗ ớ

ả • Gi i pháp:

– Khi phát sinh s  ki n, truy n th i gian hi n hành

l p ớ

ố ế ừ ừ

ự ệ ẽ ử ụ subscribing s  s  d ng tham s  này – T o m t l p TimeEventArgs k  th a t

EventArgs: ch a th i

ộ ớ ẽ gian s  truy n đi

(cid:0)

136

Event Event

• Bài t pậ

Viết một chương trình đơn giản minh họa quản lý tài khoản ATM: khi rút tiền hoặc chuyển tiền thì hệ thống sẽ gởi tự động tin nhắn đến handphone của chủ tài khoản. Hướng dẫn: - Khi rút tiền hoặc chuyển tiền xong: phát sinh sự kiện “đã rút tiền” hoặc “đã chuyển tiền”

137

Tóm t Tóm t tắ tắ

ế

ươ

ng th c  ế

ứ ng th c

ứ ế ị ả ề

ươ void

ươ

ng th c đ

ẽ ự

ấ ả

ươ

c g i nó s  th c thi t

t c  các ph

ng th c

– Cho phép t o th  hi n ể ệ ạ – Tham chi u đ n m t ph ộ ế – Multi cast delegate tham chi u đ n nhi u ph – Multi cast là delegate có giá tr  tr  v  ph i là  – Các ph ả ứ ượ ủ c  y quy n ph i tho  signature method  ủ c a delegate – Khi delegate đ ượ ọ ề

ượ ủ

c  y quy n

đ

• Delegate

138

Tóm t Tóm t tắ tắ

ượ

c th c thi thông qua delegate

ể ệ ự

ớ ử ầ

ự ệ ọ

– Event đ ự – Th  hi n s  truy n thông qua l ề ạ i – L p phát sinh s  ki n: publishing ự ệ – Nh ng l p x  lý s  ki n: sucsribing – Thành ph n quan tr ng trong GUIs

• Event