bài 6 - interface - nền tảng lập trình ứng dụng với c#
DESCRIPTION
Khái niệm lớp giao tiếp Khai báo và khởi tạo lớp giao tiếpTRANSCRIPT
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
1
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
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
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
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
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
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
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;}
}
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
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)
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
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
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
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
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
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
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
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
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
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”);
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
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
…
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
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
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
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
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
}
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;}
}
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{}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
End
Thanks
30