CẤU TRÚC
CẤU TRÚC
VÀ
VÀ
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 (
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
{
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;
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
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
và
và
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
[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();
}
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; }
}
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
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() { … }
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.
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.
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