Ngôn Ngữ Lập Tnh C#
kiu cô lập tưng minh, tc là không cho phép kế thừa t nó. Và cũng không kế thừa được
t bất c lp nào khác. Mặc nhiên, các cấu tc vẫn kế thừa t Object như bất c kiu dữ
liu giá tr nào khác trong C#/.
Câu hỏi 2: Trong hai dạng mảng và tập hợp thì lại nào chứa cấu trúc tốt hơn?
Trả lời 2: Cấu trúc có hiệu quả khi sử dụng trong mảng hơn là lưu chúng dưới dạng tập hợp.
Dạng tập hợp tốt với kiểu dữ liệu tham chiếu.
Câu hỏi 3: Cấu trúc được lưu trữ ở đâu?
Trả lời 3: Cấu trúc như đã đề cập kiểu dữ liệu giá trị nên được lưu trữ trên stack của
chương trình. Ngược với kiểu tham chiếu được đặt trên heap.
Câu hỏi 4: Khi truyền cấu trúc cho một phương thức thì dưới hình thức nào?
Trả lời 4: Do kiểu giá trị nên khi truyền một đối tượng cấu trúc cho một phương thức t
nó được truyền dưới dạng tham trị chứ không phải tham chiếu.
Câu hỏi 5: Vậy làm thế nào truyền cấu trúc dưới dạng tham chiếu cho một phương thức?
Trả lời 5: Cũng giống như truyền tham chiếu một kiểu giá trị như int, long, char. Ta khai báo
khóa ref cho các tham số kiểu cấu trúc. khi gọi phương thức thì thêm từ khóa ref vào
trước đối mục cấu trúc được truyền vào.
Câu hỏi thêm
Câu hỏi 1: Chúng ta thể khởi tạo giá trị ban đầu cho các biến thành viên của như bên
dưới được không? Nếu không được tại sao?
struct myStruct
{
private int mNum = 100;
....
}
Câu hỏi 2: Sự khác nhau giữa kiểu dữ liệu tham chiếu và kiểu dữ liệu giá trị?
Câu hỏi 3: Sự khác nhau giữa bộ khởi dựng của cấu trúc và bộ khởi dựng của lớp?
Câu hỏi 4: nhất thiết phải dùng từ khóa new để tạo đối tượng kiểu cấu trúc hay không?
Nếu không thì còn cách nào khác nữa?
Câu hỏi 5: Quá trình boxing unboxing diễn ra với một đối tượng kiểu cấu trúc hay
không?
Bài tập
Bài tập 1: Chương trình sau đây lỗi. Hãy sửa lỗi, biên dịch, chạy chương trình. Đoạn
lệnh nào gây ra lỗi?
-----------------------------------------------------------------------------
using System;
struct TheStruct
{
Cấu Tc
173
Giáo trình hình thành hệ thống khởi tạo các giá trị ban
đầu cho các biến thành viên
.
Ngôn Ngữ Lập Tnh C#
public int x;
public TheStruct()
{
x = 10;
}
}
class TestClass
{
public static void structtaker( TheStruct s)
{
s.x = 5;
}
public static void Main()
{
TheStruct a = new TheStruct();
a.x = 1;
structtaker( a);
Console.WriteLine("a.x = {0}", a.x);
}
}
-----------------------------------------------------------------------------
Bài tập 2: Hãy tính kết quả bằng tay mà chương trình sau xuất ra. Sau đó biên dịch và chạy
chương trình để đối sánh kết quả.
-----------------------------------------------------------------------------
using System;
class TheClass
{
public int x;
}
struct TheStruct
{
public int x;
}
class TestClass
{
public static void structtaker( TheStruct s)
{
Cấu Tc
174
.
.
Ngôn Ngữ Lập Tnh C#
s.x = 5;
}
public static void classtaker(TheClass c)
{
c.x = 5;
}
public static void Main()
{
TheStruct a = new TheStruct();
TheClass b = new TheClass();
a.x = 1;
b.x = 1;
structtaker( a);
classtaker(b);
Console.WriteLine("a.x = {0}", a.x);
Console.WriteLine("b.x = {0}", b.x);
}
}
-----------------------------------------------------------------------------
Bài tập 3: Hãy sửa chương trình trong bài tập 2 để kết quả giá trị a.x của đối tượng a được
thay đổi khi ra khỏi hàm structtaker(). Dùng truyền tham chiếu cho cấu trúc.
Cấu Tc
175
.
.
Ngôn Ngữ Lập Tnh C#
Chương 8
THỰC THI GIAO DIỆN
Thực thi giao diện
Thực thi nhiều giao diện
Mở rộng giao diện
Kết hợp các giao diện
Truy cập phương thức giao diện
Gán đối tượng cho một giao diện
Toán tử is
Toán tử as
Giao diện đối lập với trừu tượng
Thực thi phủ quyết giao diện
Thực thi giao diện tường minh
Lựa chọn thể hiện phương thức giao diện
n thành viên
Câu hỏi & bài tập
Giao diện ràng buộc, giao ước đảm bảo cho các lớp hay các cấu trúc sẽ thực hiện
một điều gì đó. Khi một lớp thực thi một giao diện, thì lớp này báo cho c thành phần client
biết rằng lớp này có hỗ trợ các phương thức, thuộc tính, sự kiện và các chỉ mục khai báo trong
giao diện.
Một giao diện đưa ra một sự thay thế cho các lớp trừu tượng để tạo ra các sự ràng
buộc giữa những lớp các thành phần client của nó. Những ràng buộc này được khai báo
bằng cách sử dụng từ khóa interface, từ khóa này khai báo một kiểu dữ liệu tham chiếu để
đóng gói các ràng buộc.
Một giao diện thì giống như một lớp chỉ chứa các phương thức trừu tượng. Một lớp
trừu tượng được dùng làm lớp sở cho một họ các lớp dẫn xuất từ nó. Trong khi giao diện
là sự trộn lẫn với các cây kế thừa khác.
Thực Thi Giao Diện
176
.
.
Ngôn Ngữ Lập Tnh C#
Khi một lớp thực thi một giao diện, lớp này phải thực thi tất cả các phương thức của
giao diện. Đây là một bắt buộc mà các lớp phải thực hiện.
Trong chương này chúng ta sẽ thảo luận cách tạo, thực thi sử dụng các giao diện.
Ngoài ra chúng ta cũng sẽ bàn tới cách thực thi nhiều giao diện cùng với cách kết hợpmở
rộng giao diện.cuối cùng là các minh họa dùng để kiểm tra khi một lớp thực thi một giao
diện.
Thực thi một giao diện
Cú pháp để định nghĩa một giao diện như sau:
[thuộc tính] [bổ sung truy cập] interface <tên giao diện> [: danh sách cơ sở]
{
<phần thân giao diện>
}
Phần thuộc tính chúng ta sẽ đề cập sau. Thành phần bổ sung truy cập bao gồm:
public, private, protected, internal, protected internal đã được nói đến trong
Chương 4, ý nghĩa tương tự như các bổ sung truy cập của lớp.
Theo sau từ khóa interface tên của giao diện. Thông thường tên của giao diện
được bắt đầu với từ I hoa (điều này không bắt buộc nhưng việc đặt tên như vậy rất rõ ràng
dễ hiểu, tránh nhầm lẫn với các thành phần khác). dụ một số giao diện tên như sau:
IStorable, ICloneable,...
Danh sách sở danh sách các giao diện giao diện này mở rộng, phần này sẽ
được trình bày trong phần thực thi nhiều giao diện của chương. Phần thân của giao diện chính
là phần thực thi giao diện sẽ được trình bày bên dưới.
Giả sử chúng ta muốn tạo một giao diện nhằm mô tả những phương thức và thuộc tính
của một lớp cần thiết để lưu trữ truy cập từ một sở dữ liệu hay các thành phần lưu trữ
dữ liệu khác như là một tập tin. Chúng ta quyết định gọi giao diện nàyIStorage.
Trong giao diện này chúng ta xác nhận hai phương thức: Read() Write(), khai báo
này sẽ được xuất hiện trong phần thân của giao diện như sau:
interface IStorable
{
void Read();
void Write(object);
}
Mục đích của một giao diện để định nghĩa những khả năng chúng ta muốn
trong một lớp. dụ, chúng ta thể tạo một lớp tên Document, lớp này lưu trữ các dữ
liệu trong cơ sở dữ liệu, do đó chúng ta quyết định lớp này này thực thi giao diện IStorable.
Để làm được điều này, chúng ta sử dụng pháp giống như việc tạo một lớp mới
Document được thừa kế từ IStorable bằng dùng dấu hai chấm (:) và theo sau là tên giao diện:
Thực Thi Giao Diện
177
.