Tải bản đầy đủ (.ppt) (24 trang)

Tài liệu Cấu trúc và giao diện doc

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 (493.06 KB, 24 trang )

CẤU TRÚC
CẤU TRÚC


GIAO DIỆN
GIAO DIỆN
Giảng viên phụ trách:
Giảng viên phụ trách:
Nguyễn Hoàng Tùng
Nguyễn Hoàng Tùng
Bộ môn Tin học
Bộ môn Tin học
Email:
Email:
Mục đích bài học
Mục đích bài học
Cấu trúc (struct):
Khái niệm, khai báo và sử dụng struct,
Phân biệt được struct và class,
Nhận biết khi nào nên dùng struct.
Giao diện (interface)
Khái niệm, khai báo và sử dụng interface,
Phân biệt được interface và lớp abstract,
Xây dựng interface.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
2
2
Cấu trúc (


Cấu trúc (
struct
struct
)
)
Là một kiểu dữ liệu tham trị (value type).
Sử dụng struct đối với các kiểu dữ liệu nhỏ, đơn giản, có các
phương thức và thuộc tính như kiểu dữ liệu bẩm sinh (int,
float, string, ).
Dùng để đóng gói các trường dữ liệu có liên quan với nhau.
Ví dụ: Tạo cấu trúc để biểu diễn một điểm trên trục toạ độ
hai chiều.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
3
3
Khai báo
Khai báo
struct
struct
Cú pháp:
[access-modifier] struct identifier [:interface-list] { struct member }
Ví dụ:
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
4

4
public struct Location {
private int xVal;
private int yVal;
public Location(int x, int y) {
this.xVal = x;
this.yVal = y;
}
public override string ToString( ) {
return String.Format (“{0},{1}”,
xVal, yVal );
}
public struct Location {
private int xVal;
private int yVal;
public Location(int x, int y) {
this.xVal = x;
this.yVal = y;
}
public override string ToString( ) {
return String.Format (“{0},{1}”,
xVal, yVal );
}
public int X
{
get { return xVal; }
set { xVal = value; }
}
public int Y
{

get { return yVal; }
set { yVal = value; }
}
}
public int X
{
get { return xVal; }
set { xVal = value; }
}
public int Y
{
get { return yVal; }
set { yVal = value; }
}
}
Hàm tạo và Kế thừa
Hàm tạo và Kế thừa
Ngầm định kế thừa từ lớp Object. Ngoài ra, struct không kế
thừa bất cứ class hay struct nào khác, và không làm cơ sở
cho một class hay struct nào khác.
Không dùng từ khóa abstract và sealed.
Biến thành viên không có từ khóa protected.
Các phương thức không có từ khóa abstract và virtual.
Từ khóa override chỉ sử dụng khi override các phương thức
được kế thừa từ đối tượng Object.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
5

5
Hàm tạo và Kế thừa
Hàm tạo và Kế thừa
Struct có thể thực thi (xây dựng lại) nhiều interface.
Nếu có hàm tạo thì phải có tham số, không cho phép hàm
tạo không tham số.
Các thành viên của struct không có bộ khởi gán (initializer).
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
6
6
interface IShape()
{
void Paint();
}
struct Rectangle : Ishape
{
public void Paint() { … }
private int x, y, z;
}
interface IShape()
{
void Paint();
}
struct Rectangle : Ishape
{
public void Paint() { … }
private int x, y, z;

}
struct KeyValue
{
private string key;
private string value;
public KeyValue(string key, string value)
{
this.key = key; this.value = value;
}
}
struct KeyValue
{
private string key;
private string value;
public KeyValue(string key, string value)
{
this.key = key; this.value = value;
}
}
Struct là một kiểu dữ liệu
Struct là một kiểu dữ liệu
tham trị
tham trị
Ví dụ:
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
7
7

static void Main()
{
Location loc = new Location(200, 300);
myFunc(loc);
Console.WriteLine(loc.ToString());
}
static void myFunc(Location loc)
{
loc.X = 100 ;
loc.Y = 200;
}
static void Main()
{
Location loc = new Location(200, 300);
myFunc(loc);
Console.WriteLine(loc.ToString());
}
static void myFunc(Location loc)
{
loc.X = 100 ;
loc.Y = 200;
}
Kết quả:
loc.X = ?
loc.Y = ?
loc.X = ?
loc.Y = ?
Một kiểu khai báo khác của
Một kiểu khai báo khác của
struct

struct
Tạo đối tượng struct không dùng từ khóa new:
Struct là kiểu trị nên có thể tạo một đối tượng struct không cần
từ khóa new (giống như các kiểu bẩm sinh: int, long, )
Không triệu gọi hàm tạo (constructor).
Phải khởi gán các biến thành viên trước khi gọi các phương
thức.
Ví dụ:
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
8
8
static void Main() {
Location loc;
loc.X = 100 ;
loc.Y = 200;
myFunc(loc);
}
static void Main() {
Location loc;
loc.X = 100 ;
loc.Y = 200;
myFunc(loc);
}
Không triệu gọi hàm tạo
Không triệu gọi hàm tạo
Phải khởi gán các biến thành viên trước khi gọi các
phương thức.

Phải khởi gán các biến thành viên trước khi gọi các
phương thức.
So sánh
So sánh
struct
struct


class
class
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
9
9
Sử dụng struct khi nào?
Sử dụng struct khi nào?
Thể hiện (instance) có kích thước nhỏ (16 byte).
Có chu kỳ ngắn.
Thông thường nằm lồng trong một đối tượng thuộc class
nào đó.
Không có ý định cho việc kế thừa.
Không thường xuyên được sử dụng để boxing.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
10
10

Demo
Demo
struct
struct
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
11
11
Giao diện (
Giao diện (
interface
interface
)
)
Giao diện giống như một bản vẽ thiết kế, nó đảm bảo việc
các chương trình muốn xây dựng lại giao diện phải thực thi
tất cả những gì trong bản vẽ.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
12
12
Khai báo
Khai báo
interface
interface
Cú pháp:

[access-modifier] interface identifier [:base-list] { interface body }
Không thể cài đặt code trong phần thân.
Tên giao diện nên bắt đầu bằng chữ I hoa (IShape, ISinhVien).
Các thành viên trong phần thân chỉ bao gồm: phương thức,
thuộc tính, sự kiện, bộ chỉ mục.
Không thể chứa: hằng, biến, toán tử, hàm tạo, hàm hủy,
kiểu dữ liệu và các từ khóa: abstract, public, protected,
internal, private, virtual, override.
Khi một class (hoặc struct) thiết đặt một giao diện thì phải thi
công tất cả các thành viên của giao diện này.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
13
13
Xây dựng
Xây dựng
interface
interface
Ví dụ:
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
14
14
interface IStorable
{
void Read();

void Write(object obj);
int Status { get; set; }
}
interface IStorable
{
void Read();
void Write(object obj);
int Status { get; set; }
}
public class Document : Istorable {
public void Read() {
Console.WriteLine("Thi công hàm
Read của IStorable");
}
public void Write(object obj)
{
Console.WriteLine(obj);
}
private int m_Status;
public int Status {
get { return
m_Status; }
set { m_Status =
value; }
}
}
public class Document : Istorable {
public void Read() {
Console.WriteLine("Thi công hàm
Read của IStorable");

}
public void Write(object obj)
{
Console.WriteLine(obj);
}
private int m_Status;
public int Status {
get { return
m_Status; }
set { m_Status =
value; }
}
}
Xây dựng
Xây dựng
interface
interface
Thiết đặt cùng lúc nhiều giao diện:
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
15
15
interface IStorable
{
void Read();
void Write(object obj);
int Status { get; set; }
}

interface ICompressible
{
void Compress();
void Decompress();
}
interface IStorable
{
void Read();
void Write(object obj);
int Status { get; set; }
}
interface ICompressible
{
void Compress();
void Decompress();
}
public class Document : IStorable,
ICompressible
{
private int m_Status;
// Thi công giao diện
IStorable
public void Read() { … }
public void Write(object obj)
{ … }
public int Status { … }
// Thi công giao diện
ICompressible
public void Compress()
{ … }

public void Decompress()
{ … }
}
public class Document : IStorable,
ICompressible
{
private int m_Status;
// Thi công giao diện
IStorable
public void Read() { … }
public void Write(object obj)
{ … }
public int Status { … }
// Thi công giao diện
ICompressible
public void Compress()
{ … }
public void Decompress()
{ … }
}
Xây dựng
Xây dựng
interface
interface
Thiết đặt cùng lúc nhiều giao diện:
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
16

16
Xây dựng
Xây dựng
interface
interface
Phối hợp cùng lúc nhiều giao diện và mở rộng:
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
17
17
interface IStorable {
void Read();
void Write(object obj);
int Status { get; set; }
}
interface ICompressible {
void Compress();
void Decompress();
}
interface IStorableCompressible :
IStorable, ICompressible {
void LogSavedBytes();
}
interface IStorable {
void Read();
void Write(object obj);
int Status { get; set; }
}

interface ICompressible {
void Compress();
void Decompress();
}
interface IStorableCompressible :
IStorable, ICompressible {
void LogSavedBytes();
}
public class Document :
IStorableCompressible {
private int m_Status;
// IStorable
public void Read() { … }
public void Write(object obj)
{ … }
public int Status { … }
// ICompressible
public void Compress()
{ … }
public void Decompress()
{ … }
// IStorableCompressible
public void LogSavedBytes()
{…}
}
public class Document :
IStorableCompressible {
private int m_Status;
// IStorable
public void Read() { … }

public void Write(object obj)
{ … }
public int Status { … }
// ICompressible
public void Compress()
{ … }
public void Decompress()
{ … }
// IStorableCompressible
public void LogSavedBytes()
{…}
}
Xây dựng
Xây dựng
interface
interface
Phối hợp cùng lúc nhiều giao diện và mở rộng:
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
18
18
Truy xuất các phương thức của
Truy xuất các phương thức của
interface
interface
Truy xuất các thành viên của IStorable thông qua các thành
viên của lớp Document.
Không thể tạo thể hiện giao diện một cách trực tiếp.

Tạo thể hiện của giao diện bằng cách ép (casting) đối
tượng Document về kiểu IStorable.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
19
19
static void Main(string[] args) {
Document doc = new
Document();
doc.Status = -1;
doc.Read();
// Tạo thể hiện bàng cách ép
IStorable iStor = (IStorable)doc;
iStor.Status = 0;
iStor.Read();
}
static void Main(string[] args) {
Document doc = new
Document();
doc.Status = -1;
doc.Read();
// Tạo thể hiện bàng cách ép
IStorable iStor = (IStorable)doc;
iStor.Status = 0;
iStor.Read();
}
Ép đối tượng Document về
kiểu giao diện IStorable.

Ép đối tượng Document về
kiểu giao diện IStorable.
Truy xuất các phương thức của
Truy xuất các phương thức của
interface
interface
Toán tử is:
Cú pháp: expression is type
Kiểm tra xem expression (kiểu dữ liệu qui chiếu) có thể ép an
toàn về kiểu type không.
Toán tử as:
Cú pháp: expression as type
Kiểm tra xem expression có thể ép an toàn về kiểu type không.
Nếu hợp lệ sẽ trả về type. Ngược lại trả về null.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
20
20
Document doc = new Document();
IStorable iStor;
if (doc is IStorable)
iStor = (IStorable)doc;
Document doc = new Document();
IStorable iStor;
if (doc is IStorable)
iStor = (IStorable)doc;
Document doc = new Document();
IStorable iStor = doc as IStorable;

if (iStor != null)
iStor.Read();
Document doc = new Document();
IStorable iStor = doc as IStorable;
if (iStor != null)
iStor.Read();
So sánh
So sánh
interface
interface
và lớp
và lớp
abstract
abstract
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
21
21
So sánh
So sánh
interface
interface
và lớp
và lớp
abstract
abstract
Abstract class cũng có thể thiết đặt một interface nên cũng
phải thi công tất cả các thành viên của các interface.

Được phép ánh xạ các hàm của interface thành các hàm
trừu tượng.
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
22
22
interface IStorable
{
void Read();
void Write(object
obj);
}
interface IStorable
{
void Read();
void Write(object
obj);
}
abstract class AbsClass : IStorable
{
public abstract void Read();
public abstract void Write(object obj);
}
abstract class AbsClass : IStorable
{
public abstract void Read();
public abstract void Write(object obj);
}

Lớp kế thừa abstract class phải tuân thủ
xây dựng lại tất cả các thành phần
abstract.
Lớp kế thừa abstract class phải tuân thủ
xây dựng lại tất cả các thành phần
abstract.
Demo
Demo
interface
interface
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
23
23
Giải đáp thắc mắc
Giải đáp thắc mắc
20/12/2011
20/12/2011
Chuyên đề Ngôn ngữ lập trình 3
Chuyên đề Ngôn ngữ lập trình 3
24
24

×