Как вы можете переопределить перечисление в C #? - PullRequest
5 голосов
/ 18 октября 2011

Это мой код:

void Main()
{
    StarTrek baseClass = new StarTrek();
    NewGeneration childClass = new NewGeneration();

    baseClass.ShowEnum();
    childClass.ShowEnum();
}

public class StarTrek
{
    internal enum Characters
    {
        Kirk, Spock, Sulu, Scott
    }

    public void ShowEnum()
    {
        Type reflectedEnum = typeof(Characters);
        IEnumerable<string> members = reflectedEnum.GetFields()
                                            .ToList()
                                            .Where(item => item.IsSpecialName == false)
                                            .Select(item => item.Name);
        string.Join(", ", members).Dump();
    }
}

public class NewGeneration : StarTrek
{
    internal new enum Characters
    {
        Picard, Riker, Worf, Geordi
    }       
}

ShowEnum всегда отображает:

Кирк, Спок, Сулу, Скотт

, даже если он был вызван в классе NewGeneration. Я что-то упускаю / неправильно понимаю? Есть ли способ для ShowEnum использовать NewGeneration.Characters вместо StarTrek.Characters?

Ответы [ 4 ]

6 голосов
/ 18 октября 2011

Ваше второе перечисление shadowing первое, точно так же, как объявление нового поля в NewGeneration.Вложенные типы не являются полиморфными - код в ShowEnum будет всегда ссылаться на StarTrek.Characters;код создается для этого типа во время компиляции.

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

(Стоит отметить, что перегрузка и переопределение, между прочим, разные - ваш вопрос касается перегрузки, но я думаю, что вы имели в виду переопределение.)

2 голосов
/ 18 октября 2011

Вы не можете перегружать enum s - они не являются классами или структурами.

С internal new вы просто скрываете исходное свойство, хотя, поскольку вы ShowEnum определены в базовом классе, реализация свойства базового класса называется.

1 голос
/ 27 марта 2014
class Program
{
    public static void Main()
    {
        StarTrek baseClass = new StarTrek();
        NewGeneration childClass = new NewGeneration();

        baseClass.ShowEnum();
        childClass.ShowEnum();
        Console.ReadLine();
    }
}


public class StarTrek
{
    internal enum Characters
    {
        Kirk, Spock, Sulu, Scott
    }

    public virtual void ShowEnum()
    {
        Type reflectedEnum = typeof(Characters);
        IEnumerable<string> members = reflectedEnum.GetFields()
                                            .ToList()
                                            .Where(item => item.IsSpecialName == false)
                                            .Select(item => item.Name);
        Console.WriteLine(string.Join(", ", members.ToArray()));
    }
}

public class NewGeneration : StarTrek
{
    internal new enum Characters
    {
        Picard, Riker, Worf, Geordi
    }

    public override void ShowEnum()
    {
        Type reflectedEnum = typeof(Characters);
        IEnumerable<string> members = reflectedEnum.GetFields()
                                            .ToList()
                                            .Where(item => item.IsSpecialName == false)
                                            .Select(item => item.Name);
        Console.WriteLine(string.Join(", ", members.ToArray()));

    }
}
1 голос
/ 18 октября 2011
public class StarTrek
{
    internal virtual IList<string> Characters
    {
        get
        {
            return new List<string> { Kirk, Spock, Sulu, Scott };
        }
    }

    public void ShowEnum()
    {
        string.Join(", ", Characters).Dump();
    }
}

public class NewGeneration : StarTrek
{
    internal override IList<string> Characters
    {
        get
        {
            return new List<string> { Picard, Riker, Worf, Geordi };
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...