Chương 8 Giao diện
8.2.3 Toán tử “as”
Toán tử as kết hợp tác tử is và sự phân bổ các thao tác bằng việc kiểm tra sự phân bổ có hợp lệ hay không (giá trị sẽ trả về là true) và sau đấy sẽ hoàn tất công việc. Nếu sự phân bổ không hợp lệ (tác tử is sẽ trả về giá trị false), tác tử as sẽ trả về giá trị null. Cú pháp của việc khai báo:
expression as type
Đoạn mã sau đây sử dụng tác tử as:
Giao diện Gvhd: Nguyễn Tấn Trần Minh Khang
{
Document doc = new Document("Test Document");
IStorable isDoc = doc as IStorable;
if (isDoc != null) isDoc.Read( ); else
Console.WriteLine("IStorable not supported"); ICompressible icDoc = doc as ICompressible; if (icDoc != null)
icDoc.Compress( ); else
Console.WriteLine("Compressible not supported"); }
Hãy xem qua đoạn mã MSIL, chúng ta thấy có một sốđiểm thuận tiện:
IL_0023: isinst ICompressible IL_0028: stloc.2
IL_0029: ldloc.2
IL_002a: brfalse.s IL_0034 IL_002c: ldloc.2
IL_002d: callvirt instance void ICompressible::Compress( ) 8.2.4 Toán tử is hay toán tử as
Các giao diện xem ra có vẻ là những lớp trừu tượng. Thật ra thì chúng ta có thể thay
đổi phần khai báo của giao diện IStorable thành lớp trừu tượng:
abstract class Storable {
abstract public void Read( ); abstract public void Write( ); }
Lớp Document kế thừa từ lớp Storable, giả sử như chúng ta vừa mua một lớp List từ
một hãng thứ ba với mong muốn là có sự kết hợp của List với Storable. Trong C++ ta có thể tạo một lớp StorableList bằng cách kế thừa từ List và Storable nhưng trong C# thì ta không thể vì C# không hỗ trợđa thừa kế.
Mặc dù vậy, C# cho phép chúng ta chỉ rõ ra số giao diện và kết xuất từ lớp cơ sở. Bằng vệc tạo một giao diện Storable, ta có thể kế thừa từ lớp List và giao diện IStorable như trong ví dụ sau:
public class StorableList : List, IStorable {
// List methods here ... public void Read( ) {...}
public void Write(object obj) {...} // ...
}