2017-02-20 1 views
-1

Enum 값 (예 : 열거 형 WorkDay : 월요일, 화요일, 수요일 등)과 연결된 특정 방법 ("기분"이라고하는 방법)을 호출하려고합니다.
필자는 분명히 선택 사례를 수행하고 아래의 특정 메소드를 호출 할 수 있습니다.열거 형 및 인터페이스

Public Enum WorkDay 
    Monday 
    Tuesday 
    Wednesday 
    Thursday 
    Friday 
End Enum 

Dim CurrentDay As Class1.WorkDay = Class1.WorkDay.Monday 
    Select Case CurrentDay 
     Case Class1.WorkDay.Monday 
      Function_Monday() 
     Case Class1.WorkDay.Tuesday 
      Method_Tuesday() 
     Case Class1.WorkDay.Wednesday 
      Method_Wednesday() 
     Case Class1.WorkDay.Thursday 
      Method_Thursday() 
     Case Class1.WorkDay.Friday 
      Method_Friday() 
    End Select 

그러나 이전에 Enum에 대한 인터페이스를 사용하여 다른 클래스의 메소드를 호출하는 방법을 보았습니다. 즉, 새로운 Enum 유형의 새 클래스를 추가하기 만하면 확장이 가능하므로 최신 Enum 유형 (예 : 토요일 및 일요일)에 케이스 다리를 추가 할 필요가 없습니다. 누구나이 Enum 인터페이스에 대한 템플릿 코드를 제공 할 수 있습니까? 다시 작성할 수 없기 때문입니다. 나는 뭔가를 놓치고있어!

+1

왜'Method'는'WorkDay'를 인수로 사용하지 않습니까? 그런 다음 하나의 메소드와 하나의 호출 만 필요합니다. 부가 메모 : 이미 ['DayOfWeek'-enum] (https://msdn.microsoft.com/en-us/library/system.dayofweek (v = vs.110) .aspx)이 있으며 현재 ['DateTime.DayOfWeek'] (https://msdn.microsoft.com/en-us/library/system.datetime.dayofweek (v = vs.110) .aspx) :'Dim dow = Date.Today.DayOfWeek ' –

+1

당신은 이것을 망에서 보았을 때 shure하고 있습니까?자바에서 enum은 메소드를 가질 수 있고 enum-s 메소드는 인터페이스를 구현할 수 있습니다. – k3b

+0

수업 열거 형을 찾는 것처럼 들리십니까? 그리고 이러한 클래스가 Class1.WorkDay.GetMood()를 호출 할 수 있도록 특정 인터페이스를 구현하고 싶습니까? 나는 .Net에서 그런 것을 보지 못했다. 아마 당신은 속성을 사용하여 이와 비슷한 것을 보았을 것입니까? http://stackoverflow.com/questions/25323406/calling-a-method-by-enum-attribute-in-c-sharp –

답변

0

열거 형을 메서드에 전달할 수 있습니까? 그리고 그것을 기반으로 논리를 실행합니까? 이 쉽게 형태 보증 된 열거 패턴에 의해 처리됩니다 다음

Function ProcessDay(DayOfWeek as WorkDay) As IWorkDay 

    Select Case DayOfWeek 
     Case WorkDay.Monday 
      Return <<class that inherits IWorkDay>> 

     Case WorkDay.Tuesday 
      Return <<class that inherits IWorkDay>> 


    End Select 

End Function 
1

같은

일부 것은,이 문서 (및 링크 된 이전) 좋은 개요를 참조하십시오. 여기

Enhancing the Typesafe Enum Pattern

사용자의 특정 문제가이 패턴에 의해 처리 될 수있는 방법의 예입니다 (VB의 .NET로 변환) :
Public Class WorkDay 
    ' private constructor 

    Private Sub New(day As String) 
     Me.Day = day 
    End Sub 

    Public Day As WorkDay 

    Public Sub DoDayJob() 
    ' do whatever need done for that day of the week 
    End Sub 

    Public Shared Monday As New WorkDay("Monday") 
    Public Shared Tuesday As New WorkDay("Tuesday") 
    Public Shared Wednesday As New WorkDay("Wednesday") 
    Public Shared Thursday As New WorkDay("Thursday") 
    Public Shared Friday As New WorkDay("Friday") 
End Class 

'used like this (to assign the 'Monday' value) 
Dim day = Workday.Monday 

내가 하나의 방법을 추가, 그러나 클래스가 될 수 있습니다 복잡 할 정도로 복잡합니다.

이 나를 위해 작동하는 것 같다
+1

감사합니다. Alex. 내가 대답을 입력하는 동안 C# 태그가 제거되었을 때 약간 혼란 스러웠습니다. –

0

-보다는 Select Case 문 각 Enum 값을 통해이 루프 반복을하고 Enum 변수에 비교하고 Enum 이름과 일치하는 적절한 이름을 가진 메소드를 실행

For Each day As class1.WorkDay In System.Enum.GetValues(GetType(class1.WorkDay)) 
     If CurrentDay = day Then 
      CallByName(Me, "Method_" & [Enum].GetName(GetType(class1.WorkDay), day), CallType.Method, Nothing) 
     End If 
    Next 

코드 작성 방법에 따라 몇 가지 사항을 변경해야하지만 기본 아이디어는있을 수 있습니다.

0

향후 열거 형 값 및/또는 클래스를 허용한다는 목표에 대한 설명을 기반으로 간단한 해법은 기본 열거 형에 키가있는 대리인 사전을 사용하는 것입니다.

Public Class Class1 
    Public Enum WorkDay 
     Monday 
     Tuesday 
     Wednesday 
     Thursday 
     Friday 
    End Enum 

    Public Shared Sub Method_Monday() 
    End Sub 
    Public Shared Sub Method_Tuesday() 
    End Sub 
    Public Shared Sub Method_Wednesday() 
    End Sub 
    Public Shared Sub Method_Thursday() 
    End Sub 
    Public Shared Sub Method_Friday() 
    End Sub 
End Class 

Public Class Class2 
    Public Enum NotWorkDay 
     Saturday 
     Sunday 
    End Enum 
    Public Shared Sub Method_Saturday() 
    End Sub 
    Public Shared Sub Method_Sunday() 
    End Sub 
End Class 

그리고 위의 클래스를 사용하여 클래스 (이 경우의 WinForm)는, 다음과 같이 보일 것입니다 :

Public Class Form1 

    ' declare the delegate dictionary 
    Private WorkMethods As New Dictionary(Of [Enum], Action) 

    Public Sub New() 
     InitializeComponent() 
     SetWorkMethods() 
    End Sub 

    Private Sub SetWorkMethods() 
     'fill the dictionary with the needed actions 
     WorkMethods.Add(Class1.WorkDay.Monday, New Action(AddressOf Class1.Method_Monday)) 
     WorkMethods.Add(Class1.WorkDay.Tuesday, New Action(AddressOf Class1.Method_Tuesday)) 
     WorkMethods.Add(Class1.WorkDay.Wednesday, New Action(AddressOf Class1.Method_Wednesday)) 
     WorkMethods.Add(Class1.WorkDay.Thursday, New Action(AddressOf Class1.Method_Thursday)) 
     WorkMethods.Add(Class1.WorkDay.Friday, New Action(AddressOf Class1.Method_Friday)) 
     WorkMethods.Add(Class2.NotWorkDay.Saturday, New Action(AddressOf Class2.Method_Saturday)) 
     WorkMethods.Add(Class2.NotWorkDay.Sunday, New Action(AddressOf Class2.Method_Sunday)) 
    End Sub 

    ' a helper method to retrieve and execute the action 
    Private Sub DoWork(day As [Enum]) 
     Dim actionToPerform As Action = Nothing 
     If WorkMethods.TryGetValue(day, actionToPerform) Then 
      If actionToPerform IsNot Nothing Then actionToPerform() 
     End If 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     DoWork(Class1.WorkDay.Wednesday) 
    End Sub 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     DoWork(Class2.NotWorkDay.Saturday) 
    End Sub 
End Class 

이러한 사용은 당신을 제공

이 같은 클래스 선언을 가정 변경이 필요할 때 Select-Case 블록을 다시 작성해야 할 필요없이 호출 된 메서드를 구성 할 수있는 많은 유연성이 있습니다. 사전에 항목을 추가/삭제하면됩니다.