2012-01-06 4 views
2

나는 Modify이라는 함수를 가지고있다. 그것은 이렇게 delcared입니다 :Generics를 다룰 때 VB.Net의 다형성

Public Function Modify(Of SIMType As {New, DAOBase})(ByVal obj As DAOBase) As Boolean 

이 기능은 일반적인 것을 볼 수 있습니다. DAOBase 또는 DAOBase의 하위 클래스 인 객체를 paramer로 가져옵니다. 수정 기능 내부

통화과 같이있다 :

DAOToGP(obj) 

다형성이 역할을하는 곳입니다. DAOBase이라는 하위 클래스가 4 개 정도 있습니다. 나는이 유형들 각각에 DAOToGP()을 썼다. 따라서 Modify() 함수에서 DAOToGP(obj)을 호출하면 다형성이 시작되어 Modify()에 전달되는 유형에 따라 DAOToGP()의 올바른 구현을 호출해야합니다.

Error 20 Overload resolution failed because no accessible 'DAOToGP' can be called without a narrowing conversion: 
'Public Shared Function DAOToGP(distributor As Distributors) As Microsoft.Dynamics.GP.Vendor': Argument matching parameter 'distributor' narrows from 'SierraLib.DAOBase' to 'IMS.Distributors'. 
'Public Shared Function DAOToGP(product As Products) As Microsoft.Dynamics.GP.SalesItem': Argument matching parameter 'product' narrows from 'SierraLib.DAOBase' to 'IMS.Products'. C:\Users\dvargo.SIERRAWOWIRES\Documents\Visual Studio 2010\Projects\SIM\Dev_2\SIM\IMS\DVSIMLib\GP\GPSIMRunner\Runners\RunnerBase.vb 66 39 IMS 

여기 손실에 가지입니다 :

그러나, 나는 다음과 같은 오류가 발생합니다. 내가 전화 할 기능을 알아낼 수없는 이유는 확실치 않습니다. 어떤 아이디어?

Public Function Modify(Of SIMType As {New, DAOBase})(ByVal obj As SIMType) As Boolean 

그렇지 않으면 당신의 제네릭 형식 매개 변수가 쓸모없는 것 :

답변

1

당신은 objSIMType 대신 DAOBase로 지정해야합니다.


편집 :

귀하의 DAOToGP 기능이 서로 다른 서명이 분명히 기본 클래스에서 파생되지 않습니다. 이 시도 :

Public Class DAOBase(Of Tin, Tout) 
    Public Function DAOToGP(ByVal obj As Tin) As Tout 
    End Function 
End Class 

Public Module Test_DAOBase 
    Public Function Modify(Of Tin, Tout)(ByVal obj As DAOBase(Of Tin, Tout)) As Boolean 
    End Function 
End Module 

또한 추상 클래스 추상 함수 (의 MustInherit)와 DAOToGP (MustOverride)로 DAOBAse를 선언 할 수 : 다음

Public MustInherit Class DAOBase(Of Tin As {New}, Tout) 
    Public MustOverride Function DAOToGP(ByVal obj As Tin) As Tout 
End Class 

Public Class DAOProduct 
    Inherits DAOBase(Of Products, SalesItem) 

    Public Overrides Function DAOToGP(ByVal obj As Products) As SalesItem 
     Return Nothing 
    End Function 
End Class 

Public Module Test_DAOBase 
    Public Function Modify(Of Tin As {New}, Tout)(ByVal obj As DAOBase(Of Tin, Tout)) As Boolean 
     Dim out As Tout = obj.DAOToGP(New Tin())  'This is OK 
    End Function 

    Public Sub TestModify() 
     Dim daoProd = New DAOProduct() 
     Modify(daoProd) 'This is OK 
    End Sub 
End Module 

DAOBase에서 대한 상속 다른 클래스를 선언 매개 변수 유형의 다른 조합 (예제에서는 DAOProduct).

+0

SIMTye는 함수에서 몇 가지 다른 장소에 사용됩니다. 그러나 왜 과부하 해결이 실패합니까? 왜 DAOToGP()의 올바른 버전을 찾을 수 없는지? – user489041

0

당신이하려는 것은 인수의 런타임 유형을 기반으로 런타임에 오버로드 해결을 수행하는 것입니다. 그러나 VB 오버로드는 컴파일 시간에이 아니며 런타임은이 아닙니다. (Option Strict Off을 사용하지 않는 한 나중에 참조하십시오.)

문제는 제네릭 사용과 관련이 없습니다. 비 일반 루틴에서는 문제가 없습니다.

이렇게 적은 수의 유형에 가장 적합한 솔루션은 간단한 If 블록 일 수 있습니다.

If obj Is TypeOf subclassone Then 
    Dim obj1 As subclassone 
    obj1 = obj 
    DAOToGP(obj1) 
ElseIf obj Is TypeOf subclasstwo Then 
    Dim obj2 As subclasstwo 
    obj2 = obj 
    DAOToGP(obj2) 
    'and so on... 

또는 대안이 Option Strict Off를 사용하고

Dim objWhatever As Object 
objWhatever = obj 
DAOToGP(obj) ' resolved at runtime, might Throw 

쓰기하지만이Option Strict Off 때문에 비활성화하지 않는 것이 좋습니다 하는이 similar question

에서 볼 수 있듯이 당신은 array of delegates indexed by System.Type를 사용할 수 있습니다 아주 유용한 컴파일러 검사.

관련 문제