2009-08-05 3 views
0

나는 data 정상적인 매개 변수이며 f은 (Process에 대리자로 전달)작성 및 대리인으로 사용자 정의 함수를 통과 (VB.NET 2005)

데이터를 처리하는 데 필요한 기능입니다 함수 Process(data, f)f의 서명은 int f(a,b,c)이고, 위임자를 호출 할 때 Process에서 제공 한 a, b, c입니다.

여기까지, 표준 대리인 사용.

이제 Process를 상수 f 함수로 호출하고자하는 특별한 경우가 있습니다. 그래서 SimpleProcess(data, k)을 작성하여 발신자가이 경우 대리인을 만들 필요가 없으므로 상수 k (필요한 유일한 정보)를 전달하십시오.

그래서 저는 동적으로 상수 함수 인 g(a,b,c)을 만들 필요가 있습니다.이 매개 변수는 무시되는 3 개의 매개 변수를 취해 항상 k을 반환합니다. 이것은 SimpleProcess 함수 내에서 수행되어야합니다. 따라서이 특별한 경우를 위해 Process 함수를 다시 작성할 필요없이 해당 함수 내에서 Process(data, g)을 간단하게 호출 할 수 있습니다.

가능하며 어떻게 할 수 있습니까?

감사합니다.

답변

2

편집 : 좋아, 나는 제목에 "2005"비트를 발견하지 못했습니다. 내 원래의 대답은 나중에 (라인 아래)입니다 - 여기 VB.NET 2005에 대한 완전한 대답입니다.

당신은 상수 값을 가지고 클래스 (또는 구조체, 내가 추측)를 만들 수 있고 AddressOf을 사용하여 해당 유형의 함수를 대리자로 가져옵니다. 이 두 단계를 함께 수행하는 Shared 함수를 만들어 간단하게 만들 수 있습니다.당신이 그것을 사용하는 것이 귀하의 경우에는

Public Delegate Function Function3 (ByVal x As Integer, _ 
    ByVal y As Integer, ByVal z As Integer) As Integer 

Public Class Constant 

    Private value As Integer 

    Public Sub New (ByVal value As Integer) 
     Me.value = value  
    End Sub 

    Public Function ReturnValue(ByVal x As Integer, _ 
     ByVal y As Integer, ByVal z As Integer) _ 
     As Integer 
     Return value 
    End Function 

    Public Shared Function CreateFunction _ 
     (ByVal x As Integer) As Function3  
     Dim c As Constant = New Constant(x) 
     return AddressOf c.ReturnValue 
    End Function 

End Class 

Public Module Test 
    Public Sub Main 
     Dim func As Function3 = Constant.CreateFunction(3) 
     Console.WriteLine(func(8, 9, 10)) 
    End Sub 
End Module 

:

다음은이 문제를 설명하기 짧지 만 완전한 프로그램입니다

Process(data, Constant.CreateFunction(g)) 

원래 대답

당신이 할 수있는 세 개의 매개 변수를 사용하더라도 람다 표현식을 사용하십시오. 정말 좋은 :

Process(data, Constant(g)) 

사과의 경우 :

Public Function Constant(value as Integer) As MyDelegateType 
    Return Function(x as Integer, y as Integer, z as Integer) value 
End Function 

다음과 전화 :

Process(data, Function(x as Integer, y as Integer, z as Integer) g) 

가 또 다른 대안이 상수가 반환하는 기능을 반환하는 함수 를 작성하는 것 어떤 문법은 약간입니다. 저는 VB 사람이 아닙니다.

+0

VB.NET 2005에서 람다 식을 사용할 수 있습니까? 하지만 lamda 표현식 (OCaml과 같은 기능 언어에서는 매우 간단 함)을 사용하면 매우 쉽습니다. – Laurent

+0

기본적으로 제 문제는 다음과 같습니다. VB.NET 2005에서 람다 식없이 어떻게 할 수 있습니까? – Laurent

+0

아니요. VB8에서는 람다 식을 사용할 수 없습니다. 상수를 보유 할 클래스를 만든 다음 AddressOf를 사용하여 매개 변수를 무시하고 값을 반환하는 함수를 참조하는 대리자를 가져와야합니다. –

0

다른 서명으로 함수를 두 개로 분리하는 것이 고려해 봤습니까? 나는 당신의 델리게이트 함수가 상수가 제공하는 값을 리턴 할 것이라고 생각한다.

따라서 위 메서드 버전의 메서드는 단순히 "상수"값을 계산하는 데 필요한 처리를 수행합니다.

Function Process(ByVal data As Object, ByVal f As MyDelegate) As Object 
    Dim k As Integer 
    ' Calculate k 

    Return Process(data, k) 
End Function 

Function Process(ByVal data As Object, ByVal k As Integer) As Object 
    Dim stuff As Object 

    ' do stuff with k 
    Return stuff 
End Function 

Delegate Function MyDelegate(ByVal a As Object, ByVal b As Object, ByVal c As Object) As Integer 
+0

네, 저는 Process (data, d)와 SimpleProcess (data, k)를 구분했습니다. "상수가 제공 한 값을 반환하는 대리자 함수"는 내가하려고하는 것입니다. 나는 SimpleProcess에서이 값 k를 가지고 있는데, 어떻게하면 항상 k를 리턴하는 델리게이트 d를 만들 수 있습니까? – Laurent

+0

수정 사항에 회신하십시오 : 반대입니다! 델리게이트 사용의 요점은 Process 함수가 여러 매개 변수로 여러 번 호출하므로 다른 값 (일반적인 경우)을 반환하므로 단순히 "첫 번째"상수를 계산할 수 없다는 것입니다. – Laurent

0

더 새로운 언어가 람다 식을 지원한다는 점을 감안할 때, 일부 대표적인 클래스의 델리게이트 팩토리를 만드는 것이 좋습니다. 나는 세 가지 변수 매개 변수의 기능을 위해이 작업을 수행하지는 않았지만 이러한 접근법은 쉽게 적용 할 수 있습니다. 이 접근법은 @Jon Skeet :의 대답과 비슷하지만 제 일반적인 팩토리 중 하나 (3 개의 변수와 하나의 고정 된 매개 변수로 확장 한 경우) 중 하나를 사용하려면 4 개의 매개 변수를 취하는 함수를 정의하는 것이 좋을 것입니다 단순히 마지막 하나를 리턴하고 람다 식 달리, 상기 코드의 수정을 무효화하지 않고, 추가, 변경, 또는 삭제 될 수

 
    Process(data, FunctionOf(of Integer, Integer, Integer, Integer).NewInv(of Integer)(AddressOf FunctionToReturnLastValue, 19)) 

메모 (예를 들어, 19의 값) 원하는 대리자를 만들 -and-continue (마지막 (Integer)가 유추 될 수 있음을 유의하십시오). 또한 람다와 달리 고정 매개 변수 값은 호출 될 때가 아니라 대리자가 만들어 질 때 평가됩니다.

관련 문제