2012-02-17 6 views
1

전용 기본 클래스 방법 만 있습니까?기본 클래스 전용 메서드?

모듈을 사용하는 방법이 있지만 기본 클래스에서만 사용되는 기능을 구분합니다.

나는

Dim d0 = Token.Parse(Of Digit)(cr) 

하지만

Dim d1 = Digit. 

는 구문 분석 방법을 표시하지 않을 경우 이제 다음

Public MustInherit Class Token 
    ' Token stuff 
    NotInheritable Shared Function Parse(Of T As Token)(CR As CharReader) As T 
    ' Would also be good to be able to do the following without resorting 
    ' to the reflection based bodgery. 
    Return T.Parser(CR) 
    End Function 
End Class 

Public Class Digit 
    Inherit Token 
    ' Digit Stuff 
    Protected Shared Function Parser(CR As CharReader) As Digit 
    If CR.Current.HasValue = False Then Return Nothing 
     Case Select CR.Value 
     Case "0"c To "9"c 
      Return New Digit(CR.Index,0) 
     Case Else 
     Return False 
     End Select 
    End Function 

의 줄 생각이었다.

어떻게 이렇게 할 수 있습니까?

EDIT (가능하다면)

현재 구현 이해야 정말 토큰 클래스

Public Module TokenModule 
    Public Function Parse(Of T As Token)(cr As CharReader) As T 
    ' 
    ' Here Be Nasty Reflection Based Bodge Job 
    ' 
    ' Why? What I want to write. (Call a static method on the generic (constrianed) type  specifier.) 
    ' 
    ' Return T.Parser(cr) 
    ' 
    ' Start Bodgery { 
    Dim tt As T 
    tt = GetType(T).InvokeMember("Parser", 
           Reflection.BindingFlags.InvokeMethod + 
           Reflection.BindingFlags.NonPublic + 
           Reflection.BindingFlags.Static, Nothing, tt, {cr}) 
    Return tt 
    ' } End Bodgery 
End Function 
End Module 

토큰 (자료) 클래스

Public MustInherit Class Token 
    Private _Index As Integer 
    Private _Count As Integer 
    Protected Friend Sub New(ByVal Index As Integer, Count As Integer) 
    _Index = Index : _Count = Count 
    End Sub 
    Public ReadOnly Property Index As Integer 
    Get 
     Return _Index 
    End Get 
    End Property 
    Public ReadOnly Property Count As Integer 
    Get 
     Return _Count 
    End Get 
    End Property 
    Protected Shared Function Parser(cr As CharReader) As Token 
    Return Nothing 
    End Function 
End Class 
의 유일한 방법 기본 클래스

숫자 클래스

Public Class Digit 
    Inherits Token.Token 
    Private Sub New(ByVal Index As Integer, Count As Integer) 
    MyBase.New(Index, Count) 
    End Sub 
    Protected Overloads Shared Function Parser(cr As CharReader) As Digit 
    Dim crc = cr.Current 
    If crc.HasValue = False Then Return Nothing 
     Select Case crc.Value 
     Case "0"c To "9"c 
      Return New Digit(cr.Index, 1) 
     Case Else 
      Return Nothing 
     End Select 
    End Function 
End Class 
+0

그리고이 용도는 무엇입니까? –

+0

'CharReader' 란 무엇입니까? 'Parse' 문제로 당신을 도울 수 있다는 것을 알아야합니다. –

+0

CharReader가 어떤 유형이 될 수 있는지는 중요하지 않습니다. –

답변

2

그런 종류의 관계가 실제로 OO 개념을 어기 게됩니다. 부모 유형이 공용 기능을 제공하면 자식도 부모가되어야한다고 생각합니다.

당신이 원하는 기능의 종류는 상속보다는 구성을 통해 쉽게 얻을 수 있습니다 (숫자에는 해당 인스턴스에 필요한 모든 호출이 토큰 및 인스턴스 인스턴스를 포함합니다).

+0

Digit은 Token의 subtype이 필요합니다. object를 사용하지 않고 type -safe 컨테이너에 넣을 수 있기 때문입니다. –

+0

@AdamSpeight - 그런 다음 필요한 기능 만 제공하는 토큰 및 숫자에 모두 적용 할 수있는 인터페이스를 만듭니다. –

+0

구문 분석은 정적/공유이어야합니다. Parse 메소드에 포함될 코드는 ** 모든 ** 인스턴스화 된 클래스에 공통이므로 실제로 공유해야합니다. 그래서 그 요구 사항은 이것을 배제합니다. 또한 인터페이스를 배제합니다. 내가 필요한 것은 ** 클래스 객체 ** 그 클래스의 인스턴스가 아닙니다. –

0

CharReaderIConvertible을 구현하는 경우 System.Convert으로 다른 유형으로 변환 할 수 있습니다. Boolean, String, Char, Int32, Double 등과 같은 표준 유형은 IConvertible을 구현합니다.

Shared Function Parse(Of T As Token)(ByVal CR As CharReader) As T 
    Return DirectCast(Convert.ChangeType(CR, GetType(T)), T) 
End Function 

-

Parse이 아닌 공공 방법은 유형 이름을 통해 액세스하기 때문에이 공유 방법에 대해서만 작동

Protected Shared Shadows Function Parse(ByVal CR As CharReader) As Digit 
        ^
        | 
      (note the Shadows keyword) 

주를 그림자에 의해 가려 될 수 있으며, 인스턴스를 통해서가 아닙니다.

+0

하지만 Token 클래스에서만 액세스 할 수 있습니다. Token.Parse (Of Digit) Digit.Parse() 또는 Token의 다른 파생 하위 클래스. –

+0

'Shadows' 키워드로'Parse'를 선언하고 protected로'Digit.'를 입력하면 intellisense는'Parse' 메소드를 보여주지 않을 것입니다! –

1

에는 구문 분석 방법이 표시되지 않습니다.

잘 모르겠지만 IntelliSense가 해당 방법을 보여줄지 걱정됩니다.EditorBrowsableAttribute를 사용하면 쉽게 해결할 수 있습니다.

Imports System.ComponentModel 
... 
Class Token 
    Public Shared Sub Parse() 
     '' etc 
    End Sub 
End Class 

Class Digit 
    Inherits Token 

    <EditorBrowsable(EditorBrowsableState.Never)> _ 
    Public Shared Shadows Sub Parse() 
     Token.Parse() 
    End Sub 
End Class 
+0

구문 분석은 정적/공유이어야합니다. Parse 메소드에 포함될 코드는 ** 모든 ** 인스턴스화 된 클래스에 공통이므로 실제로 공유해야합니다. 그래서 그 요구 사항은 이것을 배제합니다. 또한 인터페이스를 배제합니다. 내가 필요한 것은 ** 클래스 객체 ** 그 클래스의 인스턴스가 아닙니다. –

+0

그럼 그냥 공유하도록 설정하십시오. 게시 된 게시물은 여전히 ​​작동합니다. 이것은 OOP의 원칙을 재 설계하지 않고서도 가능합니다. –

+0

하지만 여전히 Digit.Parse()를 쓸 수 있습니다. PARSE는 ** Token ** 객체에만 존재해야하며 intellisense에서 보이지는 않습니다. –

관련 문제