2012-09-19 3 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 

질문 : 어떤 이유로 내가 공통의 인터페이스 클래스에서 클래스 1과 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

그러면 Reflection을 시도 할 수 있습니다. –

관련 문제