2012-02-17 16 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

このような関係が実際にオブジェクト指向の概念を破ります。親タイプがパブリック機能を提供する場合、その子も同様に(子が親であると考える)必要があります。

継承ではなく、構成によってトークンのインスタンスが含まれ、そのインスタンスに必要なすべての呼び出しをプロキシするプロキシを使用して、必要な機能を簡単に実現できます。

+0

私は、オブジェクトを使用するのではなくタイプセーフなコンテナに入れることができるので、トークンのサブタイプである必要があります。 –

+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

しかし、私は.ParseをTokenクラスでしかアクセスできないようにします。 Token.Parse(Of Digit)not 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からは見えません。 –

関連する問題