Mặc dù tất cả chúng ta sử dụng loại từ để tham chiếu đến giao diện, và thậm chí tài liệu MSDN mô tả giao diện là loại tham chiếu, giao diện không phải là Kiểu giống như bất kỳ loại tham chiếu nào khác hoặc bất kỳ loại giá trị nào . Đó là, trong một ý nghĩa rất thực tế không phải là một loại ở tất cả. Nó là một hợp đồng cho một hành vi (một tập các phương thức, các thuộc tính và các sự kiện) mà một kiểu phải chứa bởi đã được khai báo để thực hiện giao diện đó.
public interface ITestInterface { }
public class MyClass:ITestInterface { }
ITestInterface m = new MyClass() as ITestInterface;
var t = m.GetType();
Bạn sẽ thấy rằng mặc dù biến m
được tuyên bố là loại ITestInterface
, Type biến t
vẫn là MyClass
. Vì vậy, mặc dù, vì lý do lịch sử chúng tôi sử dụng từ loại để áp dụng cho giao diện, "loại" của giao diện là một điều rất khác nhau là loại đối tượng cụ thể, là một thể hiện của một lớp hoặc cấu trúc.
trích dẫn từ Essential Net Don Box của
Các CLR giao dịch với các đối tượng và giao diện kiểu khác so với tiền nhiệm của nó (C++ và COM). Trong C++ và COM, một loại bê tông cụ thể có một bảng phương thức cho mỗi loại cơ sở hoặc giao diện được hỗ trợ. Trong độ tương phản , một loại bê tông nhất định trong CLR có chính xác một phương pháp bảng. Theo suy luận, một đối tượng dựa trên CLR có chính xác một loại xử lý. Điều này tương phản hoàn toàn với C++ và COM, trong đó đối tượng sẽ thường có một vptr cho mỗi loại hoặc giao diện cơ sở. Vì lý do này, của CLR castclass
không dẫn đến giá trị con trỏ thứ hai trong số tương tự như của C++ dynamic_cast
hoặc số Query-Interface
của COM.
Đọc điều này rõ ràng là bản thân giao diện không bao giờ có bảng vptr hoặc CORINFO_CLASS_STRUCT
như các đối tượng cụ thể thực sự (các loại tham chiếu và giá trị) có thể có. Cấu trúc này được tạo và duy trì bởi CLR cho mỗi Kiểu được nạp bởi mã thực thi khi chạy. Một lần nữa, từ Essential Net,
Các CORINFO_CLASS_STRUCT
chứa các con trỏ tới hai bảng mô tả tất cả các giao diện kiểu hỗ trợ. Các mã vạch isinst
và castclass
[CLR] sử dụng một trong các bảng này để xác định xem loại có hỗ trợ giao diện được cho là hay không. Thứ hai trong số các bảng này là một bảng bù giao diện mà CLR sử dụng khi gửi các cuộc gọi phương thức ảo được thực hiện đối với các tham chiếu đối tượng dựa trên giao diện.
Như có thể thấy rõ ràng từ các tham chiếu này, giao diện là một loại điều cơ bản khác với loại tham chiếu (lớp) hoặc loại giá trị (cấu trúc). Mỗi đối tượng (kiểu tham chiếu) hoặc kiểu giá trị được khởi tạo hoặc được sử dụng bên trong .Net phải là một cá thể cụ thể của một lớp hoặc một cấu trúc. Và mọi đối tượng hoặc cấu trúc được nạp bởi CLR đều có tham chiếu đến một CORINFO_CLASS_STRUCT được tạo ra cho kiểu cụ thể của lớp hoặc cấu trúc đó. Intefaces là các loại của các kiểu, được định nghĩa để đảm bảo rằng bất kỳ lớp hoặc cấu trúc nào được khai báo trong danh mục đó (được khai báo để thực hiện giao diện đó), phải chứa một thành viên kiểu (phương thức, thuộc tính, sự kiện, v.v.) cho mỗi thành viên được khai báo trong định nghĩa giao diện.
+1, bạn đã đúng. Tôi đã cung cấp các ví dụ, nhưng không giải thích tại sao. – Gjeltema
@Gjeltema Tôi hy vọng sẽ truyền cảm hứng cho bạn để thêm chi tiết, không phải để xóa câu trả lời của bạn: ( –
Vâng, tôi có thể đã thêm chi tiết hơn - nhưng bạn đã trả lời nó, vì vậy dường như không có nhiều điểm. :) Đừng lo - tôi sẽ sống để trả lời một ngày khác. – Gjeltema