Объявление Enums в производных классах - PullRequest
0 голосов
/ 21 сентября 2009

Я занимаюсь разработкой программы на VB.NET.

У меня есть перечисление PriceType, объявленное в суперклассе ItemPriceBase. Есть 3 класса, которые являются производными от ItemPriceBase - ItemPriceMeasured, ItemPriceNDI и ItemPriceExtraCost. Подмножество PriceTypes для этих классов абсолютно уникально для каждого из них - измеренные цены от 1 до 6, цены NDI от 7 до 15 и цены ExtraCost от 16 до 22.

Есть ли способ объявить перечисление в суперклассе, а затем расширить перечисление в каждом из производных классов, чтобы они имели доступ только к этим опциям, но я все еще могу получить доступ к свойству в суперклассе, которое возвращает перечисление PriceType?

Спасибо, Дейн.

Ответы [ 3 ]

1 голос
/ 21 сентября 2009

Не совсем. Поскольку перечисления на самом деле просто целые числа, вы можете сделать что-то вроде этого:

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

Обратите внимание, что это работает только для линейной цепочки наследования - например, он ломается, если на том же уровне существуют производные классы одного уровня, так как для них становится очень трудно правильно передать значения перечисления правильному элементу, а не родителю, который просто имеет дело с более ограниченной областью действия.

Как правило, я бы не рекомендовал такой подход для расширяемости с открытым исходным кодом. Как видите, это кошмар обслуживания. Если у вас есть четко определенный набор областей применения, который в основном будет установлен в камне, то это выполнимо.

1 голос
/ 21 сентября 2009

Перечисления могут использовать только встроенные целочисленные типы. Вы не можете получить из Enum; они неявно запечатаны.

Все перечисления происходят от System.Enum, который происходит от System.ValueType, и они sealed, т. Е. Вы не можете получить из них.

0 голосов
/ 21 сентября 2009

В этом сценарии я обычно использую объект 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){}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...