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 [: base 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 [: base interface list]

 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

49

50