2010-04-02 5 views
1

DB에서 CSV로 내보내기를 수행해야합니다. 알파, "alphaValue", intValueTrue/False로 respresented 숫자BOOL : (.NET 2는)동적 필드 유형 처리

field; fileld; field... etc 

필드의 3 종류 되세요. 알파는 다음 ""로 설정 한 경우는 false BOOL =>이/숫자하자이 같은 경우 경우

나는 내보낼 위해, 필드 수집이 캡슐화하려고합니다.

CsvField 클래스를 구축하려고 :

Public Structure?Class CsvField(Of T As ???) 

    End Structure 

    Enum FieldType 
    Alpha 
    Bool 
    Numeric 
    End Enum 

possibile 사용 : 환영

myCollection.Add(new CsvField(DateTime.Now, FileType.Alpha)) 
myCollection.Add(new CsvField(myInt, FileType.Numeric)) 

제안.

답변

2

제네릭이 필요하지 않습니다. 간단하게 상속 사용

' abstract base class; you could possibly declare it as an interface instead: ' 
MustInherit Class CsvField 
    Public MustOverride Function Export() As String 
End Class 


' specialized class for alpha-numeric fields: ' 
Class AlphaCsvField : Inherits CsvField 
    ... 
    Public Overrides Function Export() As String 
     Return String.Format("""{0}""", value) 
    End Function 

    Private value As String 
End Class 


' specialized class for bool fields ' 
Class BoolCsvField : Inherits CsvField 
    ... 
    Public Overrides Function Export() As String 
     If value = True Then 
      Return "True" 
     Else 
      Return "False" 
     End If 
    End Function 

    Private value As Boolean 
End Class 

... 

코드 예제는 가정을 필드의 value 저장 실제 값이. 이 예제가 충분히 명확 해지기를 바랍니다. 필드 컬렉션을 유형 기본 클래스 유형으로 만듭니다 (예 : List(Of CsvField). 그런 다음 파생 된 모든 유형의 객체도 포함 할 수 있습니다.


Btw는., 어떻게, polymorphism를 사용하는 경우주의, 당신은 완전히 FieldType 열거 제거 할 수있을 수있는 필드 유형에 따라 수행 할 작업을 결정하는 모든 If/Select Case 구축합니다. 당신은 일반적으로 파생 클래스에 같은 논리를 이동 할 수 있어야

If someCsvField.FieldType = Alpha Then ... 

그러나

If TypeOf someCsvField Is AlphaCsvField Then ... 

로하고하여 If 문 제거 : 당신은 여전히 ​​그렇게 할 필요가 있다면, 당신은 대체 할 수 메소드 오버라이드. 위 예제의 요점입니다. 경우


P.S : 당신은 당신이 종류에 명시 적으로 확인하지 않고 CsvField 개체를 만드는 방법을 궁금해하고 있습니다. 당신은 당신이 당신의 List(Of CsvField) 또는 무엇이든 수집 안에 넣을 수 있도록

MustInherit Class CsvField 

    Public Shared Function Create(value As String) As CsvField 
     Return New AlphaCsvField(value) 
    End 

    Public Shared Function Create(value As Boolean) As CsvField 
     Return New BoolCsvField(value) 
    End 

    ... 

    ' as in the above code example ' 
    Public MustOverride Function Export() As String 

End Class 

예를 들어, CsvField.Create(False)BoolCsvFieldCsvField으로 "위장"을 만들 것입니다 : 한 가지 방법은 팩토리 메소드 및 방법 오버로드를 사용하는 것입니다.

+0

은 더 많은 리소스와 시간이 소요되는 다형성으로 유형이 간단한 클래스입니까? – serhio

+0

@serhio no, 상속 및 다형성을 사용할 때 리소스 또는 성능상의 불이익은 없습니다. –

+0

@serhio : 아니요, 아니면 적어도 * 추가 ​​메모리 * 오버 헤드가 귀하의 경우에 중요하지 않을 정도로 작을 수 있습니다.런타임 * 성능 *은 약간 향상 될 수도 있습니다. 이것에 대해 걱정하지 마십시오. 상속을 사용하면 구조화되고, 읽기 쉽고, 유지 보수가 용이 한 코드가 만들어 지므로 메모리에 몇 바이트를 추가로 사용하는 것보다 더 중요합니다. 아직도 그 이유에 관심이 있으시면 요청에 대한 자세한 내용을 제공 할 수 있습니다. – stakx