30
TRƯỜNG ĐẠI HC KHOA HC TNHIÊN TP.HCM TRUNG TÂM TIN HC 1

Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

Embed Size (px)

DESCRIPTION

Khái niệm lớp giao tiếp Khai báo và khởi tạo lớp giao tiếp

Citation preview

Page 1: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

1

Page 2: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khái niệm lớp giao tiếp• Kh i bá à khởi t lớ i tiế• Khai báo và khởi tạo lớp giao tiếp

2

Page 3: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khái niệm lớp giao tiếpKhai báo 1 tập các thành phần (thuộc tính phương thức)− Khai báo 1 tập các thành phần (thuộc tính, phương thức)• chỉ khai báo, nhưng không thực thi

− Các lớp thực thi interface phải cung cấp định nghĩa các ầthành phần mà interface khai báo

− Interface là một kiểu tham chiếu (reference type)

3

Page 4: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khái niệm lớp giao tiếpVí dụ: Interface IComparable− Ví dụ: Interface IComparable

public interface IComparable{

Keywork Tên interface

public interface IComparable{int CompareTo(object obj);

} Sự thực thi được thay thế bằng ;

4

Page 5: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khái niệm lớp giao tiếpInterface ICompareable− Interface ICompareable • Không thực thi phương thức CompareTo• Cung cấp mô tả chức năng phương thức CompareTo• Khi gọi, CompareTo trả về các giá trị:

–– < 0: đối tượng hiện hành < đối tượng truyền vào< 0: đối tượng hiện hành < đối tượng truyền vào–– > 0: đối tượng hiện hành > đối tượng truyền vào> 0: đối tượng hiện hành > đối tượng truyền vàoợ g ệ ợ g yợ g ệ ợ g y–– = 0: đối tượng hiện hành = đối tượng truyền vào= 0: đối tượng hiện hành = đối tượng truyền vào

5

Page 6: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khái niệm lớp giao tiếpVí dụ sử dụng IComparable− Ví dụ sử dụng IComparable.

// tạo mảng số nguyênint[] myInt=new int[]{20,4,16,9,2};

Kiểu int thực thi interface[] y []{ , , , , };

// sắp xếp các phần tửArray.Sort(myInt);// in kết quả

interface IComparable

// qforeach (int i in myInt)

Console.Write(“{0} ”,i);

6

2 4 9 16 20

Page 7: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khái niệm lớp giao tiếp− Ví dụ sử dụng IComparable.

// khai báo 1 lớp đơn giảnclass MyClass{

bli i t Th V lpublic int TheValue;}// tạo mảng có 5 phần tử với lớp vừa tạo

Cl [] Cl [ ]MyClass[] mc=new MyClass[5];// tạo và khởi gán các phần tử…

ắ ế ả ERROR M Cl khô thự

7

// sắp xếp mảngArray.Sort(mc);

ERROR : MyClass không thực thi interface IComparable

Page 8: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface• Khái iệ lớ i iế• Khái niệm lớp giao tiếp

− Thực thi interface IComparable • Khai báo interface khi khai báo lớpKhai báo interface khi khai báo lớp• Cung cấp thực thi tất cả các thành phần của interface

trong khai báo lớp

l M Cl IC blclass MyClass : ICompareable{

public int TheValue;public int CompareTo(object obj){

Thực thi phương thức CompareTo

public int CompareTo(object obj){MyClass mc=(MyClass)obj;if (this.TheValue<mc.TheValue) return -1;if (this.TheValue>mc.TheValue) return 1;et n 0

8

return 0;}

}

Page 9: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface• Khái niệm lớp giao tiếp

var myInt=new []{20,4,16,9,2};MyClass[] mc=new MyClass[5];for (int i=0;i<5;i++){

mc[i]=new MyClass();y ()mc[i].TheValue=myInt[i];

}PrintOut(“Initial Order: “,mc);( , );Array.Sort(mc);PrintOut(“Sorted Order: “,mc);

9

Initial Order: 20 4 16 9 2Sorted Order: 2 4 9 16 20

Page 10: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khai báo và khởi tạo lớp giao tiếpCác lưu ý khi khai báo interface− Các lưu ý khi khai báo interface• Khai báo interface không chứa các thành phần dữ liệu• Khai báo interface chỉ chứa các khai báo của các non-static

f ti bfunction member.–– Phương thức (methods)Phương thức (methods)–– Thuộc tính (properties)Thuộc tính (properties)

S kiệ ( )S kiệ ( )–– Sự kiện (events)Sự kiện (events)–– Chỉ mục (indexers)Chỉ mục (indexers)

• Chỉ khai báo các thành phần, không khai báo code thực thi

10

• Tên interface nên bắt đầu bằng I (ví dụ IComparable)

Page 11: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khai báo và khởi tạo lớp giao tiếp

interface MyInterface1{int DoStuff(int nVar1 int nVar2);

public

− Ví dụ:

protectedprivateinternalint DoStuff(int nVar1, int nVar2);double DoOtherStuff(string s,long x);

}public

????

− Khai báo interface có thể dùng các bổ từ truy xuất như public, private, protected, internal.

− Các thành phần của interface mặc định là public và không

11

Các thành phần của interface mặc định là public và không được dùng bổ từ truy xuất

Page 12: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khai báo và khởi tạo lớp giao tiếpThực thi interface− Thực thi interface• Chỉ có các class/ struct có thể thực thi interface• Khi thực thi interface, các class/ struct phải

–– Thêm khai báo interface vào khai báo class/ structThêm khai báo interface vào khai báo class/ struct–– Thực thi tất cả các thành phần của interface trong class/ Thực thi tất cả các thành phần của interface trong class/

structstruct

12

Page 13: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khai báo và khởi tạo lớp giao tiếpfclass MyClass: MyInterface1{

int DoStuff(int nVar1, long nVar2){// implement code

}

double DoOtherStuff(string s, long x){// implement code

}}

13

Page 14: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Khai báo và khởi tạo lớp giao tiếp− Lưu ý:

• Nếu một lớp thực thi interface, nó phải thực thi hết tất cả các thành phần của interface

• Nếu lớp được dẫn xuất từ lớp cơ sở và có thực thi interface : tên lớp cơ sở phải đặt trước các tên interface trong khai báo lớp

class Derived: MyBaseClass, IIfc1, IEnumerable, IEnumerator{

… Lớp cơ sở Interface

14

}Lớp cơ sở Interface

Page 15: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Interface là một kiểu tham chiếu (reference type)Không thể truy xuất interface trực tiếp thông qua các thành phần− Không thể truy xuất interface trực tiếp thông qua các thành phần của đối tượng thuộc lớp

− Có thể tham chiếu đến interface thông qua ép kiểu của đối tượng thuộc lớp sang kiểu interfacetượng thuộc lớp sang kiểu interface

15

Page 16: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface• Interface là một kiểu tham chiếu (reference type)

interface IIfc1{void PrintOut(string s);( g );

}class MyClass: IIfc1{

public void PrintOut(string s){Console.WriteLine(“Calling through: {0}”,s);

}}…MyClass mc=new MyClass();mc.PrintOut(“Object”);IIfc1 ifc=(IIfc1)mc;

Calling through: ObjectCalling through: Interface

Ép kiểu

16

( ) ;

ifc.PrintOut(“Interface”);… Toán tử .

Ép kiểu

Page 17: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Sử dụng toán tử As với interface− Ép kiểu một đối tượng sang kiểu interface mà nóÉp kiểu một đối tượng sang kiểu interface mà nó

không thực thi sẽ phát sinh ngoại lệ (lỗi)

− Sử dụng toán tử As:g• Nếu lớp có thực thi interface: trả về tham chiếu đến

interface• Nếu lớp không thực thi interface: trả về null (không phát• Nếu lớp không thực thi interface: trả về null (không phát

sinh ngoại lệ)

17

Page 18: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface• Sử d t á tử A ới i t f• Sử dụng toán tử As với interface

interface IIfc1{void PrintOut(string s);( g );

}class MyClass: IIfc1{

public void PrintOut(string s){Console.WriteLine(“Calling through: {0}”,s);

}}MyClass mc=new MyClass();MyClass mc=new MyClass();IIfc1 ifc=mc as IIfc1;if (ifc!=null)

ifc.PrintOut(“Interface”);

18

ifc.PrintOut( Interface );else

Console.WriteLine(“Nothing”);

Calling through: Interface

Page 19: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface• Sử d t á tử A ới i t f• Sử dụng toán tử As với interface

interface IIfc2{void PrintOut(string s);( g );

}class MyClass: IIfc1{

public void PrintOut(string s){Console WriteLine(“Calling through: {0}” s);Console.WriteLine( Calling through: {0} ,s);

}}MyClass mc=new MyClass();IIf 2 if IIf 2IIfc2 ifc=mc as IIfc2;if (ifc!=null)

ifc.PrintOut(“Interface”);else

19

elseConsole.WriteLine(“Nothing”); Nothing

Page 20: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface• Sử d t á tử A ới i t f• Sử dụng toán tử As với interface

interface IIfc2{void PrintOut(string s);( g );

}class MyClass: IIfc1{

public void PrintOut(string s){Console WriteLine(“Calling through: {0}” s);Console.WriteLine( Calling through: {0} ,s);

}}MyClass mc=new MyClass();IIf 2 if (IIf 2)

EXCEPTION

IIfc2 ifc=(IIfc2)mc;if (ifc!=null)

ifc.PrintOut(“Interface”);else

20

elseConsole.WriteLine(“Nothing”);

Page 21: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Thực thi nhiều interface− Một class/ struct có thể thực thi nhiều interfaceMột class/ struct có thể thực thi nhiều interface

− Các interface được thực thi phải được liệt kê trên khai báo lớp và cách nhau bởi dấu phẩy (“,”)p p y ( )

21

Page 22: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Thực thi nhiều interfaceinterface IDataRetrieve { int GetData() ; }interface IDataRetrieve { int GetData() ; } interface IDataStore { void SetData( int x ) ; } class MyData: IDataRetrieve, IDataStore {

int Mem1; public int GetData() { return Mem1 ; }public int GetData() { return Mem1 ; }public void SetData( int x ) { Mem1 = x ; }

} …MyData data = new MyData();data.SetData( 5 );Console.WriteLine("Value = {0}", data.GetData());

22

Page 23: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Thực thi interface với có thành phần giống nhauinterface IIfc1{

void PrintOut(string s);}

class MyClass: IIfc1, IIfc2{// ??????

}interface IIfc2{

void PrintOut(string t);}

23

Page 24: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Thực thi interface với có thành phần giống nhauclass MyClass: IIfc1, IIfc2{

public void PrintOut(string s){Console WriteLine(“Calling through: {0}” s);

1 Thực thi chung cho 2 phương thức giống nhau

Console.WriteLine( Calling through: {0} ,s);}

}…MyClass mc=new MyClass();mc.PrintOut(“Object”);…

Calling through: Object

24

Page 25: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Tham chiếu đến nhiều interfaceinterface IIfc1 { void PrintOut(string s); } interface IIfc2 { void PrintOut(string s); }

class MyClass : IIfc1, IIfc2 {public void PrintOut(string s)public void PrintOut(string s){

Console.WriteLine("Calling through: {0}", s);}

}}

Ta có thể gọi phương thức PrintOut theo 3 cách:• Từ đối tượng thuộc lớp MyClass

25

Từ đối tượng thuộc lớp MyClass• Từ tham chiếu đến interface IIfc1• Từ tham chiếu đến interface IIfc2

Page 26: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Tham chiếu đến nhiều interfaceMyClass mc = new MyClass();MyClass mc = new MyClass();IIfc1 ifc1 = (IIfc1) mc; // Get ref to IIfc1IIfc2 ifc2 = (IIfc2) mc; // Get ref to IIfc2

mc.PrintOut("object."); // Call through class objectifc1.PrintOut("interface 1."); // Call through IIfc1ifc2.PrintOut("interface 2."); // Call through IIfc2

26

Page 27: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface

• Kế thừa Interface− Một interface có thể được kế thừa từ 1/nhiều interfaceMột interface có thể được kế thừa từ 1/nhiều interface

− Chỉ định 1 interface kế thừa từ các interface khác:• Thêm danh sách các interface kế thừa vào khai báoThêm danh sách các interface kế thừa vào khai báo

interface• Các interface cách nhau bởi dấu phẩy (,)

interface IDataIO : IDataRetrieve, IDataStore{

...

27

}

Page 28: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface• Kế thừ I t f• Kế thừa Interfaceinterface IDataRetrieve{

int GetData();}

class Program{static void Main(){

MyData data=new MyData();}interface IDataStore{

void SetData(int s);}interface IDataIO: IDataRetrieve IDataStore{

MyData data=new MyData();data.SetData(5);Console.WriteLine(“{0}”,data.GetData());

}interface IDataIO: IDataRetrieve, IDataStore{}class MyData: IDataIO{

int nPrivateData;public int GetData(){

}}

public int GetData(){return nPrivateData;

}public void SetData(int x){

nPrivateData=x;

28

nPrivateData=x;}

}

Page 29: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Bài 7: Interface• Nhiề lớ th thi i t f• Nhiều lớp thực thi interfaceinterface ILiveBirth{

string BabyCalled();}

Animal[] animalArray = new Animal[3];animalArray[0] = new Cat(); animalArray[1] = new Bird();}

class Animal { }class Cat : Animal, ILiveBirth{

string ILiveBirth BabyCalled(){

animalArray[1] = new Bird(); animalArray[2] = new Dog(); foreach( Animal a in animalArray ){

ILiveBirth b = a as ILiveBirth; if (b != null)string ILiveBirth.BabyCalled(){

return "kitten"; }

}class Dog : Animal ILiveBirth {

if (b != null)Console.WriteLine("Baby is called:{0}", b.BabyCalled());

}class Dog : Animal, ILiveBirth {

string ILiveBirth.BabyCalled(){ return "puppy";

}}

29

}class Bird : Animal{}

Page 30: Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

End

Thanks

30