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ởit lớ itiế
•
Kh
a
i
bá
o v
à
khởi
t
ạo
lớ
p g
i
ao
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ếp
Khai 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ếp
Ví dụ: Interface IComparable
−
Ví
dụ:
Interface
IComparable
public
interface
I
Comparable{
Keywork Tên interface
public
interface
I
Comparable{
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ếp
Interface 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ư
ợ
n
g
hi
ệ
n hành > đối tư
ợ
n
g
tru
y
ền vào> 0: đối tư
ợ
n
g
hi
ệ
n hành > đối tư
ợ
n
g
tru
y
ền vào
ợ g ệ ợ gyợ g ệ ợ gy
–– = 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ếp
Ví dụ sử dụng IComparable
−
Ví
dụ
sử
dụng
IComparable
.
// tạo mảng số nguyên
int
[]
m
y
Int=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
q
uả
interface
IComparable
//
q
foreach (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ản
class MyClass{
bli i t Th V l
pu
bli
c
i
n
t
Th
e
V
a
l
ue;
}
// tạo mảng có 5 phần tử với lớp vừa tạo
Cl [] Cl [ ]
My
Cl
ass
[]
mc=new My
Cl
ass
[
5
]
;
// tạo và khởi gán các phần tử
…
ắ ế ả
ERROR M Cl khô thự
7
// s
ắ
p x
ế
p m
ả
ng
Array.Sort(mc);
ERROR
:
M
y
Cl
ass
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ớ iiế
•
Khái
n
iệ
m
lớ
p g
i
ao t
iế
p
− Thực thi interface IComparable
•
Khai báo interface khi khai báo lớp
Khai
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
lMCl
IC bl
c
l
ass
M
y
Cl
ass :
IC
omparea
bl
e
{
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
r
et
ur
n
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 M
y
Class
()
;
y()
mc[i].TheValue=myInt[i];
}
PrintOut
(
“Initial Order: “
,
mc
);
(,);
Array.Sort(mc);
PrintOut(“Sorted Order: “,mc);
9
Initial Order: 20 4 16 9 2
Sorted 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ếp
Cá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
fti b
f
unc
ti
on mem
b
er.
––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ụ:
protectedprivateinternal
int
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ầncủ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ếp
Thự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ếp
f
class MyClass: MyInter
f
ace1{
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ớpcơ 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ựctiế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ộclớp sang kiểu interface
tượ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
(
strin
g
s
);
(g);
}
class MyClass: IIfc1{
public void PrintOut(string s){
Console.WriteLine(“Callin
g
throu
g
h: {0}”,s);
}
}
…
MyClass mc=new MyClass();
mc.PrintOut(“Object”);
IIfc1 ifc=
(
IIfc1
)
mc
;
Calling through: Object
Calling 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ểumột đốitượ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ụn
g
toán tử As:
g
• Nếu lớp có thực thi interface: trả về tham chiếu đến
interface
•
Nếulớ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 ớii t f
•
Sử
d
ụng
t
o
á
n
tử
A
s v
ới
i
n
t
er
f
ace
interface IIfc1{
void PrintOut
(
strin
g
s
);
(g);
}
class MyClass: IIfc1{
public void PrintOut(string s){
Console.WriteLine(“Callin
g
throu
g
h: {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 ớii t f
•
Sử
d
ụng
t
o
á
n
tử
A
s v
ới
i
n
t
er
f
ace
interface IIfc2{
void PrintOut
(
strin
g
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
IIf
c
2
if
c=mc as
IIf
c
2
;
if (ifc!=null)
ifc
.PrintOut(“Interface”);
else
19
else
Console.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 ớii t f
•
Sử
d
ụng
t
o
á
n
tử
A
s v
ới
i
n
t
er
f
ace
interface IIfc2{
void PrintOut
(
strin
g
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
IIf
c
2
if
c=
(IIf
c
2)
mc;
if (ifc!=null)
ifc
.PrintOut(“Interface”);
else
20
else
Console.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 interface
Mộ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
p
hẩ
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 interface
interface
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
nhau
interface 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
nhau
class 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 interface
interface 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ừ đốitượng thuộclớpMyClass
25
Từ
đối
tượng
thuộc
lớp
MyClass
• Từ tham chiếu đến interface IIfc1
• Từ tham chiếu đến interface IIfc2