2009-09-21 16 views
0

私はVB.NETでプログラムを開発しています。派生クラス間で列挙型を宣言する

スーパークラスItemPriceBaseで宣言されているPriceTypeという列挙型があります。 ItemPriceBase - ItemPriceMeasured、ItemPriceNDIおよびItemPriceExtraCostから派生する3つのクラスがあります。これらのクラスのPriceTypesのサブセットは、それぞれ固有の価格です。測定価格は1〜6、NDI価格は7〜15、ExtraCost価格は16〜22です。

スーパークラスに列挙する方法はありますか?これらのオプションにアクセスできるように、派生クラスのそれぞれで列挙型を拡張しますが、まだPriceTypeの列挙型を返すスーパークラスのプロパティにアクセスできますか?

ありがとう、 Dane。

答えて

1

正確ではありません。あなたは、例えば、基本型としてそれらをキャストすることによって基本型を期待する方法に派生型を渡すことができ

Enum BaseTypes 
    A = 1 
    B 
    C 
End Enum 

'start with an arbitrarily high number to avoid colliding with BaseTypes 
Enum DerivedTypes 
    D = 10 
    E 
    F 
End Enum 

'ditto 
Enum OtherDerivedTypes 
    G = 20 
    H 
    I 
End Enum 

:列挙型は本当にただの整数であるので、あなたはこのような何かを行うことができます(BaseTypes)DerivedTypes.Eこれはあなたがcase文または各そうのように、関連するメソッドをオーバーライドし、あなたのBaseClassとあなたの派生クラスでチェックバインドされた非仮想実行しないと仮定すると当然の唯一の仕事:

基本クラス:

Private Overridable Sub HandleValue(ByVal val As BaseTypes) 
    Select Case val 
     Case BaseTypes.A 
      'do something 
      Exit Select 
     Case BaseTypes.B 
      'do something else 
      Exit Select 
    End Select 
End Sub 

派生クラス:

Private Overloads Overrides Sub HandleValues(ByVal val As BaseTypes) 
    Select Case DirectCast(val, DerivedTypes) 
     Case DerivedTypes.D 
      'do something D-ish 
      Exit Select 
     Case DerivedTypes.E 
      'do something E-like 
      Exit Select 
     Case Else 
      'what we got wasnt a DerivedType, pass it off to the base 
      MyBase.HandleValues(val) 
      Exit Select 
    End Select 
End Sub 

注リニア継承チェーンのため、この唯一の作品 - 例えばより限定された範囲を単に扱う親ではなく、適切な兄弟に列挙値を適切に渡すことが非常に困難になるので、同じレベルの兄弟派生クラスが存在する場合、それは分解される。

一般に、私はこのアプローチをオープンエンドの拡張性のために推奨しません。ご覧のとおり、これはメンテナンスの悪夢です。ほとんどが石で設定されている、明確に定義されたスコープ付きの使用セットがある場合、これは実行可能です。

+0

すべての出口選択が必要なわけではありません。とにかくカスケードしない – Pondidum

1

列挙型は組み込みの整数型のみを使用できます。 Enumから派生することはできません。それらは暗黙的に封印されています。

System.ValueTypeに由来する列挙型はすべてSystem.Enumに由来し、それらはsealedです。つまり、それらから派生することはできません。

+0

列挙型は整数型です。私は派生クラスの列挙型にさらに多くのメンバーを追加でき、派生クラスはそのクラスとスーパークラスで宣言されたメンバーにしかアクセスできないようにしたいと考えています。 – link664

0

私は通常、enum型の代わりにenumオブジェクトを使用します。たとえば :

public class BaseEnumType 
{ 
public readonly static BaseEnumType A=new BaseEnumType(0,"A"); 
public readonly static BaseEnumType B=new BaseEnumType(10,"B"); 
public readonly static BaseEnumType C=new BaseEnumType(20,"C"); 
public readonly static BaseEnumType[] AllBase=new []{A,B,C}; 
public int Value{get;private set;} 
public string Name {get;private set;} 
protected BaseEnumType(int value,string name) 
{ 
Value=value; 
Name=name; 
} 

} 

次にあなたがこのBaseEnumTypeから派生することができます

public class ChildEnumType:BaseEnumType 
{ 
public readonly static ChildEnumType D=new ChildEnumType(30,"D"); 
public readonly static ChildEnumType[] AllChild=new []{A,B,C,D}; 

protected ChildEnumType(int value,string name):BaseEnumType(value,name){} 
} 
関連する問題