Các thành viên của struct không có bộ khởi gán initializer.interface IShape private string key; private string value; public KeyValuestring key, string value{ this.key = key; this.value
Trang 1CẤU TRÚC VÀ GIAO DIỆN
Giảng viên phụ trách:
Nguyễn Hoàng Tùng
Bộ môn Tin học Email: nhoangtung@agu.edu.vn
Trang 2Mụ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.
Trang 3Cấu trúc (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.
Trang 4Khai báo struct
Cú pháp:
[access-modifier] struct identifier [:interface-list] { struct member }
Ví dụ:
public struct Location {
private int xVal;
private int yVal;
public Location(int x, int y) {
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 ; } }
Trang 5Hà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.
Trang 6Hà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).interface IShape()
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;
}}
Trang 7Struct là một kiểu dữ liệu tham trị
Trang 8Một kiểu khai báo khác của 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.
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.
Trang 9So sánh struct và class
Trang 10Sử 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
Trang 11Demo struct
Trang 12Giao diện (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ẽ.
Trang 13Khai báo 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
Trang 14void 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");
Trang 15void Write(object obj);
int Status { get; set; }}
int Status { get; set; }
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 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()
Trang 16Xây dựng interface
Thiết đặt cùng lúc nhiều giao diện:
Trang 17Xây dựng interface
Phối hợp cùng lúc nhiều giao diện và mở rộng:
interface IStorable {
void Read();
void Write(object obj);
int Status { get; set; }}
int Status { get; set; }
public int Status { … }
// ICompressiblepublic void Compress() { … }
public void Decompress() { … }
public class Document :
IStorableCompressible {
private int m_Status;
// IStorable
public void Read() { … }
public void Write(object obj) { … }
public int Status { … }
Trang 18Xây dựng interface
Phối hợp cùng lúc nhiều giao diện và mở rộng:
Trang 19Truy xuất các phương thức của 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.
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;
static void Main(string[] args) {
Document();
// Tạo thể hiện bàng cách ép
Ép đối tượng Document về kiểu giao diện IStorable.
Ép đối tượng Document về kiểu giao diện IStorable.
Trang 20Truy xuất các phương thức của interface
Document doc = new Document();
IStorable iStor = doc as IStorable;
if (iStor != null)
if (iStor != null)
Trang 21So sánh interface và lớp abstract
Trang 22So sánh interface và lớp 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.
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.
Trang 23Demo interface
Trang 24Giải đáp thắc mắc