2012-01-24 18 views
5

Tôi đã xem xét một số mã di sản chúng tôi có và tôi nhận thấy một cái gì đó mà đánh tôi như là đặc biệt kỳ lạ.VB.NET Giao diện Instantiation Oddity

Giả sử chúng tôi có lớp bê tông TestClass. TestClass triển khai giao diện ITestClass.

Tôi nên mong đợi loại hành vi nào trong trường hợp sau? (Tôi đã không nhận ra điều này thậm chí có thể)

Dim testClass as TestClass = Nothing 
Try 
    testClass = New ITestClass 
    ... 
End Try 

Theo như tôi hiểu, bạn sẽ buộc phải sử dụng TestClass thay vì đối tác giao diện của nó.

+0

Bạn có _certain_ 'ITestClass' là một giao diện? Bạn có thể đăng mã cho nó không? – Oded

+0

Khi tôi di chuột qua 'ITestClass' trong Visual Studio, chú giải công cụ cho biết đó là Giao diện. Khi tôi di chuột qua 'TestClass', nó nói đó là một lớp. –

Trả lời

8

một trường hợp đặc biệt, nơi giao diện có thể được khởi tạo như một lớp và giao diện có liên quan đến CoClassAttribute. Xem bài viết trên blog này để biết chi tiết:

Ví dụ từ bài viết trên blog dịch sang VB:

<ComImport(), Guid("C906C002-B214-40d7-8941-F223868B39A5"), CoClass(GetType(Foo))> _ 
Public Interface IFoo 
End Interface 

Public Class Foo 
    Implements IFoo 
End Class 

Sub Main() 
    Dim f As New IFoo() ' Compiles 
End Sub 
+4

Wow. Thật là một sự biến thái của các tính năng ngôn ngữ :) – Oded

+0

Wow ... Tôi đã phản ánh vào DLL và đó chính xác là những gì đang xảy ra. Điều đó thật lạ. –

+0

Tôi đã nghĩ từ lâu nên có một khái niệm về một "đồng đẳng" kết hợp với một giao diện; từ quan điểm * người tiêu dùng *, sự khác biệt duy nhất giữa các giao diện và các lớp là một thực tế rằng các giao diện không thể có các phương thức tĩnh hoặc các nhà xây dựng; với tâm trí của tôi, nó sẽ được sạch hơn không yêu cầu phải có bất kỳ sự khác biệt. Các co-class có thể tạo các phương thức tĩnh không? Sẽ có bất kỳ mô hình hợp lý nào cho các phương thức mở rộng đồng đẳng như vậy có sẵn trên giao diện mà không yêu cầu nhập khẩu thêm không? – supercat

Các vấn đề liên quan