Перечисление C# в интерфейсе/базовом классе?

Как-то так должно достичь вашей цели:

function RecurseDirs
{
    oldIFS=$IFS
    IFS=\n'
    for f in "$@"
    do
    -----your activity here-----
        if [[ -d "${f}" ]]; then
            cd "${f}"
            RecurseDirs $(ls -1 ".")
            cd ..
        fi
    done
    IFS=$oldIFS
}
12
задан kaem 23 June 2009 в 09:52
поделиться

5 ответов

Не существует такого понятия, как абстрактное перечисление (которое может иметь разные реализации в подклассах), но универсальные типы могут быть вариантом:

class Base<T> where T : struct {
    private T value;
    public void Foo(T value) {
        this.value = value;
    }
}
class Parent1 : Base<Parent1.Enum1> {
    public enum Enum1 {A, B, C};
}
class Parent2 : Base<Parent2.Enum2> {
    public enum Enum2 { J, H, K };
}

Единственная проблема в том, что это не обеспечивает этого можно использовать только перечисления - вы можете сделать это во время выполнения - например, в инициализаторе типа:

static Base() {
    if (!typeof(T).IsEnum) throw new InvalidOperationException(
         typeof(T).Name + " is not an enum");
}
25
ответ дан 2 December 2019 в 03:01
поделиться

Вы должны иметь возможность объявить перечисление в базовом классе, а затем изменить значения для каждого производного класса, т.е.

class MyClass
{
    public enum TestEnum { }

    public MyClass()
    {
    }
}

class MyDerivedClass
{
    public enum TestEnum { value1, value2, value3 }

    public MyDerivedClass()
    {
    }
}

класс MyDervied будет иметь доступ к TestEnum.value1, TestEnum.value2, TestEnum. value3, где MyClass будет иметь доступ только к типу.

Однако лично я не вижу в этом преимущества, я бы объявил ВСЕ значения перечисления в базовом классе и использовал бы только те, которые мне нужны для каждого класс.

Джеймс.

3
ответ дан 2 December 2019 в 03:01
поделиться

Нет, это невозможно.

Обратите внимание, что многие перечисления часто указывают на проблему с дизайном (например, многие конструкции переключателей). Проверьте эту ссылку, чтобы увидеть пример того, как выполнить рефакторинг: Замените условное выражение полиморфизмом .

1
ответ дан 2 December 2019 в 03:01
поделиться

Нет, нет способа принудительно применить что-то статичное в интерфейсе.

Возможно, вам нужно переосмыслить свой дизайн.

0
ответ дан 2 December 2019 в 03:01
поделиться

Почему вы не можете определить перечисление в базовом классе:

class Base 
{
   public enum Test {A, B, C, J, H, K};
}

И использовать только соответствующие члены enum в производных классах?

0
ответ дан 2 December 2019 в 03:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: