2012-09-19 52 views
0

請考慮以下情形:與接口後期綁定技術也許

Class Class1 
Function Func() as String 
End Function 
End Class 

Class Class2 
Function Func() as String 
End Function 

Function Func2() as String 
End Function 
End Class 

Class Class3 

Function GetClassObject as Object 
If (certain condition meets) 
    return new Class1(); 
Else 
    return new Class2(); 
End If 
End Function 

Main() 
Object obj1 = GetClassObject(); 
obj1.Func(); // Error: obj1.Func() is not defined: 
End Main 

End Class 

問題:如何因爲出於某種原因,我不能從一個共同的接口類繼承的Class1和Class2中的條件訪問obj1.Func() ?

謝謝

更新: 我用來解決這個問題,失敗的一種方法如下:

Interface ICommon 
    Function Func() as string 
    End Interface 

    Class Class3 
    ... 
     Main() 

     Dim obj1 as ICommon = TryCast(GetClassObject(), ICommon); //Error: obj1 is "Nothing" 
     obj1.Func() 

or simply: 

TryCast(GetClassObject(), ICommon).Func() //Error: obj1 is Nothing 

     End Main 
    ... 
    End Class 
+1

延遲綁定需要源代碼文件頂部的Option Strict Off。不要試圖編寫VB.NET代碼,VB和C#的這種奇怪的組合將永遠不會編譯。 –

+0

對不起,漢斯,這種情況發生在我們必須用多種語言編程時。我把它留給編譯器提醒我;) – user1683046

回答

0

你可以試試這個

Object obj1 = GetClassObject(); 

If TypeOf obj1 Is Class1 Then 
    DirectCast(obj1 , Class1).Func() 
ElseIf TypeOf obj1 Is Class2 Then 
    DirectCast(obj1 , Class2).Func() 
End If 

,或者您也可以嘗試

Dim c1 As Class1 = TryCast(obj1, Class1) 
IF Not c1 Is Nothing Then 
    c1.Func() 
Else 
    Dim c2 As Class2 = TryCast(obj1, Class2) 
    IF Not c2 Is Nothing Then 
     c2.Func() 
    End If 
End If 

或者您可以嘗試使用反射。

Dim result as String = obj1.GetType().GetMethod("Func").Invoke(obj1, null) 
+0

Yograj,感謝您的寫作。您的解決方案將絕對有效,但由於我必須密集使用,我希望找到一個優雅的解決方案。 – user1683046

+0

然後你可以嘗試反思。 –