1
Chapter 9 – ObjectBased 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 • ObjectOriented 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
• ObjectOriented Programming (OOP). • Abstraction – Trừu Tượng • Encapsulation – Đóng Gói • Inheritance – Kế Thừa • Polymorphism – Đa Hình
Giới Thiệu
9
ObjectOriented 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 TerminologyEncapsulation
ớ ủ
ể 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 TerminologyInheritance
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 TerminologyInheritance
namespace OOP
{
public partial class frmOOP_Programing : Form
{
. . .
13
OOP TerminologyInheritance
ả • 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 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ụ 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 – Trong thân l pớ
ố • 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
ệ
ằ object = new Ten_Lop (arg1, Arg2, …); 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) private double mDai; private double mRong; public CHinhCN() public CHinhCN (double d, double r) 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 ọ
ử (.):
ố ượ ươ ứ 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 28 Creating Properties in a Class (p 305) 29 Creating Properties in a Class (p 395) . Nh ng ng 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 31 32 Property
Property 32 33 Property
Property ử ụ • S d ng property 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 37 37 Ví dụVí dụ 38 38 Ví dụVí dụ 39 39 Multiple Indexer
Multiple Indexer 40 Upcast và downcast
Upcast và downcast 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
ệ ự ộ
ự
• Downcast
– Ép ki u t
ể ừ
– Tùy tr
ườ
ng h p
– Ph i ch đ nh rõ (explicit)
ị
ỉ 40 • Upcast 41 ụ ụVí d upcast
Ví d upcast 41 42 ụ ụVí d downcast
Ví d downcast Được vì handle hh đang giữ một đối tượng HinhVuong Được vì handle hh đang giữ một đối tượng HinhVuong,
mà lớp HinhChuNhat là cha của lớp HinhVuong 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 downcast
c khi downcast ể ả ả ả ợ • Đ đ m b o downcast 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 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) 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 52 53 54 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 57 58 Đối số Kiểu trả về Tên Method
Method Phần khai báo Phần định nghĩa 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 Các câu lệnh 59 60 Method overload
Method overload 60 61 Method overload
Method overload 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 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 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 66 67 VD Polymorphism
VD Polymorphism 67 68 Polymorphism
Polymorphism 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 public DerivedClass()
{ }
public override
{ return 0; }
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 Ch đ nh nghĩa tên
ph 78 79 80 Circle2.cs 81 Circle2.cs 82 Circle2.cs 83 Cylinder2.cs 84 Cylinder2.cs 85 AbstractShapesTest.cs 86 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 88 89 Sealed method
Sealed 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 91 92 Nested class
Nested class 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 ừ 93 94 Interface
Interface ể ế ừ ừ ộ • 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 95 96 Interface example
Interface example 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 eventhandling 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) public delegate string MyDelegate2(float f) 102 Instance delegate
Instance delegate 103 Call Delegate
Call Delegate 104 Multi Cast
Multi Cast 105 106 Problem
Problem 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
ườ 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 109 Solution
Solution ả • Mô t delegate CompareObj cho hàm Sort: 110 Solution
Solution 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
ả
ả 112 Solution
Solution 113 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 “ 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); • Khai báo event ự ệ ớ • 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 123 Minh h a 1ọ
Minh h a 1ọ ử ả • Khai báo event có hàm x lý mô t trên 124 Minh h a 1ọ
Minh h a 1ọ • Kích ho t s ki n
ạ ự ệ 125 Minh h a 1ọ
Minh h a 1ọ 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
ủ 128 Minh h a 1ọ
Minh h a 1ọ • Đăng ký x lý s ki n
ự ệ
ử 129 Minh h a 1ọ
Minh h a 1ọ 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ọ 132 Minh h a 1ọ
Minh h a 1ọ ọ ơ ế • Minh h a c ch event 133 Minh h a 1ọ
Minh h a 1ọ 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{
// khai báo các thuộc tính (property)
}
CHinhCN
Tên đối tượng
Tên lớp
HocSinh hs ;
hs
Tạo đối tượng
Ten_Lop object;
hs = new HocSinh();
hs
CHinhCN
// constructors
// other methods
private dataType ClassVariable
public dataType PropertyName
{
get
{
return ClassVariable;
}
set
{
ClassVariable = value;
}
}
private int year;
public int Year
{
get
{
return year;
}
set
{
year =value ;
}
}
private int year;
public int Year
{
get
{
return year;
}
private set
{
year =value ;
}
ữ
ệ
ể
ườ ở
i
}
ế
• 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;
}
}
ặ ằ
• 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;
}
}
}
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;
}
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();
}
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
((HinhVuong)hh).Width = 8;
((HinhChuNhat)hh).Width = 8;
((HinhChuNhat)o).Width = 8;
if (o is HinhChuNhat)
((HinhChuNhat)o).Width = 8;
else
Console.WriteLine("o khong la HinhChuNhat");
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 );
}
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;
}
}
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 );
}
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();
…
}
• 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
namespace QuanLyHocSinh
{
class HocSinh
{
//...
static public bool KiemTraDiem( double diem )
{
bool kq = (0<= diem && diem <= diemToiDa);
return kq;
}
}
}
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);
}
}
}
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
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);
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
{
//...
public virtual float TinhDiemTrungBinh()
{
float kq = (diemVan + diemToan) / 2;
return kq;
}
}
class HocSinhVan:HocSinh
{
//...
public override double TinhDiemTrungBinh()
{
double kq = (diemVan * 2 + diemToan) / 3;
return kq;
}
}
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ở
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();
Derived class:
Derived class:
AbstractClass
public class DerivedClass : AbstractClass
{
Bắt buộc phải có
override int AbstractMethod()
override int VirtualMethod()
ườ
Shape.cs
ử
ứ
ộ
ạ ở
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 }
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
• }
• }
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
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 }
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 }
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
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
}
}
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
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;
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 }
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);
}
}
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();
}
}
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;
}
public class FractionArtist
{
public void Draw(Fraction f) {
Console.WriteLine("Drawing the numerator {0}", f.numerator);
Console.WriteLine("Drawing the denominator {0}", f.denominator);
}
}
}
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
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)
[access modifier] interface
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
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);
}}
}}
Delegate cho dạng hàm:
void Method( int, int )
Delegate cho dạng hàm:
string Method( float )
public void Method1(int x, int y)
{
…
}
…
MyDelegate1 del1 = new MyDelegate1(Method1);
public string Method2(float f)
{
…
}
…
MyDelegate2 del2 = new MyDelegate2(Method2);
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);
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);
Xây dựng hàm Sort
tổng quát cho mảng
đối tượng có kiểu
bất kỳ
So sánh theo
So sánh theo
quy tắc nào
quy tắc nào
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
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
Đị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] );
}}
}}
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;
}}
}}
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
Event
Event
event
event
subscribe
subscribe
Thông báo
Thông báo
publish
publish
BB
Đăng ký
Đăng ký
AA
CC
public delegate
public
public event HandlerName OnEventName;
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
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
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ý
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());
}
}
}
Đố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);
}
Đố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
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);
}
}
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);
}
}
Đă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
Đượ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();
}

