615
Chương 16: Các giao diện và mẫu thông dụng
Giao diện
ICloneable
nhận dạng một kiểu là khả-sao-chép và khai báo phương thức
Clone
là
một cơ chế mà thông qua đó, bạn có thể thu lấy bản sao của một đối tượng. Phương thức
Clone
không nhận đối số nào và trả về một
System.Object
, bất chấp kiểu đang hiện thực là gì.
Điều này nghĩa là một khi đã sao một đối tượng, bạn phải ép bản sao về đúng kiểu.
Cách hiện thực phương thức
Clone
cho một kiểu tùy biến tùy thuộc vào các thành viên dữ liệu
được khai báo bên trong kiểu. Nếu kiểu tùy biến chỉ chứa các thành viên dữ liệu kiểu giá trị
(
int
,
byte
...) và
System.String
, bạn có thể hiện thực phương thức
Clone
bằng cách tạo một
đối tượng mới và thiết lập các thành viên dữ liệu của nó có giá trị giống như đối tượng hiện
tại. Lớp
Object
(tất cả các kiểu đều dẫn xuất từ đây) chứa phương thức
MemberwiseClone
dùng
để tự động hóa quá trình này. Ví dụ dưới đây trình bày một lớp đơn giản có tên là
Employee
,
chỉ chứa các thành viên chuỗi. Do đó, phương thức
Clone
dựa vào phương thức thừa kế
MemberwiseClone
để tạo bản sao.
using System;
public class Employee : ICloneable {
public string Name;
public string Title;
// Phương thức khởi dựng đơn giản.
public Employee(string name, string title) {
Name = name;
Title = title;
}
// Tạo một bản sao bằng phương thức Object.MemberwiseClone
// vì lớp Employee chỉ chứa các tham chiếu chuỗi.
public object Clone() {
return MemberwiseClone();
}
}
Nếu kiểu tùy biến của bạn có chứa các thành viên dữ liệu kiểu tham chiếu, bạn phải quyết
định xem phương thức
Clone
của bạn sẽ thực hiện một bản sao cạn (shallow copy) hay một
bản sao sâu (deep copy). Bản sao cạn nghĩa là bất kỳ thành viên dữ liệu kiểu tham chiếu nào
trong bản sao đều sẽ chỉ đến đối tượng giống như thành viên dữ liệu kiểu tham chiếu tương
ứng trong đối tượng gốc. Bản sao sâu nghĩa là bạn phải sao toàn bộ đồ thị đối tượng (object
graph) để các thành viên dữ liệu kiểu tham chiếu của bản sao chỉ đến các bản sao (độc lập về
mặt vật lý) của các đối tượng được tham chiếu bởi đối tượng gốc.