Xây d ng l p và giao di n Xây d ng l p và giao di n
ự ự
ớ ớ
ệ ệ
ộ
ộN i dung N i dung
Khai báo l pớ Constructor & destructor Hàm thành viên Thu c tính ộ Đa hình trong C# Down cast – up cast Abstract class Sealed class, nested class Interface
2
T o l p trong C# T o l p trong C#
ạ ớ ạ ớ
Khai báo l pớ
[access modifier] class
{
// class body
}
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# ữ ệ ể
ớ
ế
3
Khóa truy xu t cho class ấ Khóa truy xu t cho class ấ
M t class ch a trong namespace ch có 2 khóa truy xu t ấ
ứ
ộ
ỉ
Public: cho phép bên ngoài assembly truy xu tấ Internal: ch cho phép s d ng bên trong assembly c biên d ch sang .NET
ử ụ ượ
ỉ ậ
ị
M t assembly ch a n i dung th c thi ch
Assembly là t p mã đã đ ộ
ứ
ự
ươ
ng trình hay th ư
vi n đ ng
ộ ệ
ộ
Assembly có th ch a trong nhi u file
ứ
ể
ề
4
Các thành ph n c a class Các thành ph n c a class
ầ ủ ầ ủ
ầ
ớ
L p có th ch a các ph n sau ể ứ Constructor và destructor Field và constant Method Property Indexer Event Ch a các ki u khác (nested): class, struct, enumeration,
ứ
ể
interface và delegate
5
T o đ i t T o đ i t
ng ng
ố ượ ố ượ
ạ ạ
Khai báo
Tên đ i t ng ố ượ Tên l pớ
HocSinh hs ;
hs
Trong thân l pớ Gi ng nh thu c tính ố ư ộ Trong thân ph ng th c ươ ứ nh bi n ng t ư ế ự ươ
Kh i t o
B ng l nh new
T ở ạ ằ
ệ
T o đ i t ng ố ượ ạ
hs = new HocSinh();
hs
6
Constructor Constructor
đ ng khi t o đ i t
ng
ạ
ượ
ố ượ
ố ẽ ượ ạ
c t o m c đ nh khi không ị
ặ
Đ c g i t ọ ự ộ Cùng tên v i l p ớ ớ Constructor ko tham s s đ có b t c constructor nào
ấ ứ
Cho phép overload constructor đ t o ra nhi u cách kh i
ể ạ
ở
ề
ng
t o đ i t ạ
ố ượ
Static constructor: ko tham s , ko access modifier,
ố
7
Constructor Constructor
ặ
Constructor m c đ nh ị Không có tham số Kh i t o th hi n (đ i t
ng) khi ch a bi
t thông tin gì v nó
ể ệ
ở ạ
ố ượ
ư
ế
ề
ố ượ
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
ng cùng l p ớ ầ
ư ả
ủ
ạ
ố
Constructor khác Có m t hay nhi u tham s vào ề ộ t m t s thông tin nào v nó T o obj khi bi ế
ộ ố
ề
ạ
8
Constructor Constructor
Constructor m c đ nh Constructor m c đ nh ặ ặ ị ị
Constructor sao chép Constructor sao chép
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; } }
Constructor khác Constructor khác (t o h c sinh khi bi (t o h c sinh khi bi t h tên) t h tên) ạ ạ ọ ọ ế ọ ế ọ
9
Constructor Constructor
Khai báo private cho constructor s ko cho phép t o đ i
ố
ẽ
ạ
ngượ t
ể ạ
Ko th t o th hi n/obj
ể ệ
10
Destructor Destructor
ng b h y
ệ
ự
ụ
ệ
ị ủ
ớ
ấ
Th c hi n nhi m v “clean” khi đ i t ố ượ c Trùng tên l p và có d u “~” phía tr ướ Không có tham s và access modifier ố
M i l p ch có 1 destructor
ỗ ớ
ỉ
class HocSinh { //... ~HocSinh() { siSo--; } }
11
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 ậ ậ ớ ớ
12
Method Method
Đ i số ố Tên
namespace QuanLyHocSinh { class HocSinh { //...
Ki u tr ả ể về
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ệ
13
Method Method
namespace QuanLyHocSinh { class HocSinh { Ki u tr ả ể //... về
Không có đ i số ố
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ệ
14
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 Các ph ng th c cùng có tên là ThongBao ng th c cùng có tên là ThongBao ươ ươ ứ ứ
Các ph Các ph ng có tham s đ u vào khác nhau ng có tham s đ u vào khác nhau ươ ươ ố ầ ố ầ
15
Method - overload Method - overload
ThongBao(40);
Day la ThongBao(int)
ThongBao(6.8);
Day la ThongBao(double)
ThongBao(new HocSinh());
Day la ThongBao(HocSinh)
ThongBao(9,5);
Day la ThongBao(int, int)
16
Method – virtual method Method – virtual method
class HocSinhVan: HocSinh
{ //... }
Tên l p con ớ Tên l p cha ớ
class LopCon:LopCha { }
LopCha HocSinh
T o ra l p
ạ
ớ HocSinhVan (h c sinh chuyên văn) ọ
k th a t l p ế ừ ừ ớ HocSinh
LopCon HocSinhVan
17
Method – virtual method Method – virtual method
Ph
ươ
Khai báo t Cho phép l p con có th thay th (override)
ng th c o: ứ ả khoá virtual ừ ể ớ
ế Đây chính là th c thi tính đa hình ự
M t ph ộ
ươ
ể ượ
c th c ự
thi khác nhau
ng th c c a l p c s (l p cha) có th đ ơ ở ớ ấ ớ
ứ ủ ớ l p d n xu t (l p con) ở ớ
ẫ
18
Method – virtual method Method – virtual method
Ph
ng th c tính đi m trung bình c a l p HocSinh
ươ
ủ ớ
ứ
ể
class HocSinh
{
//...
public virtual float TinhDiemTrungBinh()
{
float kq = (diemVan + diemToan) / 2;
return kq;
}
}
19
Method – virtual method Method – virtual method
L p HocSinhVan ph quy t l
ế ạ
ủ
i cách tính đi m trung bình ể
c a l p HocSinh
ớ ủ ớ
class HocSinhVan:HocSinh
{
//...
public override double TinhDiemTrungBinh()
{
double kq = (diemVan * 2 + diemToan) / 3;
return kq;
}
}
20
Method – virtual method Method – virtual method
HocSinh hs1 = new HocSinh(6,7);
float d1 = hs1.TinhDiemTrungBinh();
HocSinhVan hs2 = new HocSinhVan(8,9);
float d2 = hs2.TinhDiemTrungBinh();
hs1 = hs2;
float d3 = hs1.TinhDiemTrungBinh();
21
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 ủ ớ ơ ở ơ ở
22
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 CircleCircle();();
Shape s3 = Shape s3.Draw(); s3.Draw();
Circle draw!
)s3; c = (CircleCircle)s3;
CircleCircle c = ( c.Draw(); c.Draw();
23
Property Property
Getter/Setter là các ph Getter: Cho phép đ i t
ươ ố ượ
ng th c: ứ ng cung c p ấ
ộ
ị ủ
giá tr c a thu c tính ra bên ngoài Setter: Cho phép bên ngoài thay đ i ổ ng
ố ượ
ị ủ
ủ
giá tr c a thu c tính c a đ i t ộ m t cách có ki m soát ể
ộ Property: ổ ượ
ể
cách dùng getter/setter truy n th ng
Đ c b sung vào C# đ thay th ế ố
ề
24
Property Property
ề
L p HocSinh có thu c tính diemVan
Đ t v n đ ặ ấ ớ
ộ
(đi m văn)
ể
ị ủ
ớ
i 10 Giá tr c a diemVan ph i t Bên ngoài có th th y và đ i giá tr ị
0 t ả ừ ổ
ể ấ
c a diemVan
ủ
Ch cho phép đ a giá tr m i
ư
ỉ
ị ớ ế
(diemMoi) vào diemVan n u giá tr ị 0 t m i là h p l
i 10)
(t
ợ ệ ừ
ớ
ớ
25
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; } }
26
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; } } }
27
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;
setset
getget
}
28
Indexer Indexer
ả
ậ
Cho phép truy c p M ng/T p ậ ng thông qua ố ượ ng và ch m c.
ỉ ụ
ố ượ
Đ t o Indexer:
h p c a đ i t ợ ủ tên đ i t ể ạ ạ
T o Property v i tên “this” Khai báo ki u d li u c a ch ỉ ể
ớ ữ ệ
ủ
m cụ ử ụ
Dùng ký hi u m ng đ đ c/ghi
S d ng Indexer: ả
ệ
ể ọ
giá tr ị
29
Ví dụVí dụ
30
Ví dụVí dụ
31
Multiple Indexer Multiple Indexer
32
Up-cast và down-cast Up-cast và down-cast
Up-cast
handle con lên handle cha
đ ng (implicit)
Ép ki u t ể ừ Luôn thành công Th c hi n t ệ ự ộ
ự
handle cha xu ng handle con ố
ợ
Down-cast Ép ki u t ể ừ Tùy tr ng h p ườ Ph i ch đ nh rõ (explicit) ị ỉ
ả
33
ụ
ụ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 là l p con c a ủ HinhChuNhat ủ HinhHoc
HinhVuong HinhVuong
34
ụ
ụVí d down-cast Ví d down-cast
((HinhVuong)hh).Width = 8;
Đ c vì handle ng ượ m t đ i t ữ ộ ố ượ hh đang gi HinhVuong
((HinhChuNhat)hh).Width = 8;
ng ượ hh đang gi HinhVuong,
Đ c vì handle m t đ i t ữ ộ ố ượ mà l p ớ HinhChuNhat là cha c a l p ủ ớ HinhVuong
((HinhChuNhat)o).Width = 8;
c vì handle ng ượ m t đ i t ữ ộ ố ượ o đang gi
HocSinhVan, ệ
Không đ mà l p ớ HocSinhVan và l p ớ HinhChuNhat không có quan h cha-con c n có user-defined cast ầ
35
Ki m tra tr Ki m tra tr
c khi down-cast c khi down-cast
ể ể
ướ ướ
ể ả
ầ
ả handle có ph i đang gi
Đ đ m b o down-cast thành công, c n ki m tra xem ể đ i t ng phù h p hay không ữ ố ượ
ợ
ả
T khóa:
ừ
is
if (o is HinhChuNhat) ((HinhChuNhat)o).Width = 8; else Console.WriteLine("o khong la HinhChuNhat");
36
Abstract class Abstract class
ng ko cho phép t o th hi n c a l p đó
ừ ượ
ể ệ ủ ớ
L p tr u t ạ ớ S d ng polymorphism đòi h i ỏ ử ụ
ng th c là virtual hay abstract trong l p
ứ
ớ
ươ ng
khai báo các ph c s tr u t ơ ở ừ ượ
ớ
ng thì ph i
ấ ứ ớ
ẫ ươ
ừ ượ
ả
B t c l p nào có m t ph khai báo l p là l p tr u t
ng
Override chúng trong l p d n xu t (l p con) ấ ớ ng th c tr u t ứ ộ ừ ượ
ớ
ớ
37
Abstract class Abstract class
Abstract Method Abstract Method
Virtual Method Virtual Method
từ khoá: virtual Có phần thực thi cho phương thức virtual ở lớp cơ sở
từ khoá: abstract Chỉ có phần khai báo method và kết thúc là dấu “;”, Không cần có phần thực thi cho phương thức abstract ở lớp abstract Bắt buộc lớp dẫn xuất phải override lại từ khoá override trước phương thức ở lớp con
Không bắt buộc lớp dẫn xuất phải override từ khoá override trước phương thức ở lớp con
38
Abstract class - example Abstract class - example
Abstract class: Abstract class:
public abstract class AbstractClass {
public AbstractClass() { } public abstract int AbstractMethod() ; public virtual int VirtualMethod() { return 0; }
}
39
Abstract class - example Abstract class - example
Derived class: Derived class:
AbstractClass public class DerivedClass : AbstractClass {
override int AbstractMethod()
public DerivedClass() { } public override {
return 0;
override int VirtualMethod()
} public override {
return base.VirtualMethod ();
}
}
B t bu c ph i có ắ ả ộ
40
Sealed Class Sealed Class
ọ
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 ế ừ ớ
ượ ớ ớ
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);
}
}
41
Sealed method Sealed method
using System; class MyClass1 {
c ướ
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();
}
}
S d ng sealed tr ử ụ ng th c đ ngăn ko ph ể ươ cho l p d n xu t override ấ ớ ứ ẫ
42
Nested class Nested class
c khai báo bên trong thân c a l p khác g i là:
L p đ ớ
ựơ
ọ
ủ ớ ọ
inner class hay nested class, l p kia g i là outer class L p n i có th truy c p t t c thành viên c a l p ngoài,
ớ ậ ấ ả
ủ ớ
ể
ộ k c private
L p n i n m trong l p ngoài nên nó có th là private v i
ớ
ớ
ể
ộ ằ
Khi l p n i khai báo là public thì có th truy xu t thông
ể
ấ
ớ ể ả ớ l p ngoài ớ ớ
qua tên c a l p ngoài: outer_class.inner_class
ộ ủ ớ
43
Nested class Nested class
c thành ph n ầ
Truy xu t đ ấ ượ 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;
44
} public class FractionArtist { public void Draw(Fraction f) { Console.WriteLine("Drawing the numerator {0}", f.numerator); Console.WriteLine("Drawing the denominator {0}", f.denominator); } } }
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); } }
ng t ng t ớ ớ nh ư nh ư ươ ươ ự ự
Truy xu t l p inner qua l p ấ ớ Truy xu t l p inner qua l p ấ ớ outer, l p outer t ớ outer, l p outer t ớ manespace manespace
45
Interface Interface
Interface quy đ nh các ch c năng nh ng không mô t ứ
ư
ị
c ả ụ
ứ
th chúng ể ng th c trong interface Ph ươ Ch khai báo, không đ nh nghĩa ỉ Không có t
khóa ph m vi, luôn là
ừ
public
ộ
ị ạ ể ứ
Interface không th ch a thu c tính T khóa:
ừ
interface
ể
(ph
ế ớ ả
ế ừ
ồ ủ
ợ ầ
ươ
th c) trong h p đ ng (interface)
Có th xem interface nh m t b n h p đ ng, n u l p nào s ư ộ ả ử ng d ng (k th a) nó thì ph i th c thi đ y đ các mô t ự ả ụ ợ
ứ
ồ
46
Interface Interface
[access modifier] interface
M t interface có th k th a t
nhi u interface
ể ế ừ ừ
ề
ộ khác
M t l p có th k th a t
ể ế ừ ừ
ề
Ph i đ nh nghĩa t
t c ph
ấ ả
ươ
nhi u interface ng th c mà các interface "cha" ứ
S k th a interface ph i đ t sau s k th a
ộ ớ ả ị quy đ nhị ự ế ừ
ự ế ừ
ả ặ
l pớ
Các interface th
ng đ
c đ t tên v i ti n t
ườ
ượ
ớ ề ố
ặ
là “I” IFile, IComparable, IDisposable, IStorable, ICloneable…
47
Interface - example Interface - example
public interface IStudent {
int StudentID {
ồ Khai báo property StudentID Khai báo property StudentID ồg m hàm get ,set g m hàm get ,set
Khai báo ph Khai báo ph ng th c ng th c ươ ươ ứ ứ
get; set;
} void AddSubject(string subjectName);
}
ả ị
Ph i đ nh nghĩa {get,set} c a ủ ở StudentID và AddSubject l p th c thi interface ớ
ự
AddSubject AddSubject
48
Interface - example Interface - example
class Student
: IStudent Student : IStudent
ắ ộ ớ
public class public {{
ị
int studentID = 0; studentID = 0; ArrayList subjects =
subjects = nullnull;;
{}{}
private int private private ArrayList private Student() public Student() public StudentID int StudentID public int 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);
}}
}}
B t bu c l p student ph i ả đ nh nghĩa property Student và hàm AddSubject