Tải bản đầy đủ (.pdf) (30 trang)

nền tảng lập trình c bài 7 interface

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (303.63 KB, 30 trang )

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


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



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



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



public



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



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





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



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

×