2011-11-15 22 views
1

これから継承すべき基本クラスは基本的な名前/値のペアですか?継承できる名前/値クラス?

たとえば、2つのプロパティ(名前と値)しか持たないクラスがいくつかあります。彼らはすべてField、Dataなどのユニークなものを呼び、さまざまなものに使用されていますが、内部はすべて同じで、2つのプロパティ(名前と値)があり、CollectionBaseから継承する関連するコレクションクラスがあります。同じコードを共有するか、同じ基本クラスから継承するようにできることはありますか?彼らはまた、アセンブリのさまざまな保護レベルに位置しているので、私はすべてのシナリオで同じクラスを使用したくありません。

Public Class Field 

     Public Sub New() 

     End Sub 

     Private _name As String 
     Public Property Name() As String 
      Get 
       Return _name 
      End Get 
      Set(ByVal value As String) 
       _name = value 
      End Set 
     End Property 

     Private _value As String 
     Public Property Value() As String 
      Get 
       Return _value 
      End Get 
      Set(ByVal value As String) 
       _value = value 
      End Set 
     End Property 

    End Class 


    Private NotInheritable Class FieldCollection 
     Inherits CollectionBase 

     Public Sub New() 

     End Sub 

     Public Sub Add(ByVal field As Field) 
      List.Add(field) 
     End Sub 

     Public Sub Remove(ByVal index As Integer) 
      If index > Count - 1 Or index < 0 Then 
       Console.WriteLine("Can't remove this item") 
      Else 
       List.RemoveAt(index) 
      End If 
     End Sub 

     Default Public ReadOnly Property Item(ByVal index As Integer) As Field 
      Get 
       Return CType(List.Item(index), Field) 
      End Get 
     End Property 

    End Class 

    Public Class Data 

     Public Sub New() 

     End Sub 

     Private _name As String 
     Public Property Name() As String 
      Get 
       Return _name 
      End Get 
      Set(ByVal value As String) 
       _name = value 
      End Set 
     End Property 

     Private _value As String 
     Public Property Value() As String 
      Get 
       Return _value 
      End Get 
      Set(ByVal value As String) 
       _value = value 
      End Set 
     End Property 

    End Class 


    Private NotInheritable Class DataCollection 
     Inherits CollectionBase 

     Public Sub New() 

     End Sub 

     Public Sub Add(ByVal data As Data) 
      List.Add(data) 
     End Sub 

     Public Sub Remove(ByVal index As Integer) 
      If index > Count - 1 Or index < 0 Then 
       Console.WriteLine("Can't remove this item") 
      Else 
       List.RemoveAt(index) 
      End If 
     End Sub 

     Default Public ReadOnly Property Item(ByVal index As Integer) As Data 
      Get 
       Return CType(List.Item(index), Data) 
      End Get 
     End Property 

    End Class 

等...

UPDATE

Here's a PasteBin of the code that I'm looking to streamline.うまくいけば、このことができます。

答えて

3

KeyValuePair<TKey, TValue>を参照してくださいように聞こえるものです、KeyValuePairを探しているあなたのように聞こえます。この構造体は、たとえば.NETのDictionary<TKey, TValue>クラスで、特定のキーに対して汎用の値を格納するために使用され、継承が問題でない限り、それのサウンドによってユーザーの要件に適合する必要があります。

あなたはどのような種類の継承を使用したくないしかし継承が本当に必要/要求された場合、あなたはラップするために、使用組成物を交互に.NET4s Tuple<T1, T2>(これは.Item1.Item2ことになるが)、またはいずれかを使用することができた場合KeyValuePair<TKey, TValue>をカスタムオブジェクトに追加します。

編集:例を見ると、これはDictionary<string, string>の良い使用例のようです。ディクショナリを使用したくない具体的な理由はありますか、それともコレクションの中に他のビルドがあるのか​​は、これにはかなり適していますか?特定のクラスを宣言することで、内部クラス、プライベートクラス、保護されたクラスなどを宣言することによって、常にそれらのクラスを「保護」することができます。

+1

これは適切だと思われますが、OPは彼が同じクラスを使用したくないと述べ、 'KeyValuePair'は' struct'です。継承はオプションではありません。 –

+0

Tuple を継承するクラスを作成しようとしていますが、動作させることができません。 Tuple に0引数を取るコンストラクタが含まれていないことがわかります。 2つの引数、Enum、および文字列を受け取るコンストラクタを書きましたが。 – Nick

+0

@ニックあなたの継承するクラスについてはエラーではなく、むしろTupleについて言います。 Tupleには0引数のコンストラクタがありません。利用できるコンストラクタの1つを自分で呼び出す必要があります。例えば。 public MyClass(Enum myEnum、string str):ベース(myEnum、str){}。私はあなたがTupleから継承しているのはなぜか、それを単なるstructまたはstructの代わりに使用しているのかどうかはわかりませんが。 –

0

第1の目的は、KeyValuePairです。ただし、classは構造体から派生することはできません。私はあなたがTupleから継承できると信じています。しかしそれには一つの注意点があります - タプルは基本的に不変です。

また、CollectionBaseから派生した独自のクラスを作成する理由はわかりません。私はあなたが与えたものから何の利益も見ません - List<Of Field> ...またはList<Of Data>を使用することをお勧めします。

私はこの非常に基本的な解決策を考え出すでした

:あなたもTuple<T1,T2>MSDN docs here

0

基本クラスを継承するクラスの代わりに役立つかもしれません。そうでなければ、私はあなたが継承できるクラスがあるとは思わない。しかし、自分で作成することもできます。

0

A KeyValuePairは、構造であり、そのようなものとして継承することはできません、より一般的に行くと使用することができます

Module Module1 
    Private fieldCollection As New List(Of Field) 

    Sub Main() 
     Dim _field As Field = New Field() 
     _field.Name = "Foo" 
     _field.Value = "BarBaz" 

     fieldCollection.Add(_field) 

    End Sub 

End Module 

Public Class Field 
    Inherits DataPair 

End Class 

Public MustInherit Class DataPair 
    Private _name As String 
    Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Set(ByVal value As String) 
      _name = value 
     End Set 
    End Property 

    Private _value As String 
    Public Property Value() As String 
     Get 
      Return _value 
     End Get 
     Set(ByVal value As String) 
      _value = value 
     End Set 
    End Property 
End Class