C # Универсальный вопрос наследования типов - PullRequest
0 голосов
/ 31 мая 2011
class ThirdType : SecondType
{
}

class SecondType : FirstType<SecondType>
{
}

class FirstType<T> 
{
    public static void ShowType()
    {       
        Console.WriteLine(typeof(T).Name);
    }
}


ThirdType.ShowType();

В этом коде будет напечатано "SecondType"

Я хочу знать, можно ли здесь напечатать "ThirdType"?

Мне нужен способ, когда я вызываю статический метод ThirdType.ShowType (), он выводит ThirdType. Два способа, которые я могу придумать, это изменить метод на

public static void ShowType<O>() 
{ 
  Console.WriteLine(typeof(O).Name);
}

другой способ

public static void ShowType(Type t)
{ 
  Console.WriteLine(t.GetType().Name);
}

Я не могу думать о других путях

Ответы [ 5 ]

3 голосов
/ 31 мая 2011

Нет.Почему он должен печатать ThirdType?Вы печатаете тип T, который является универсальным параметром, который вы передали FirstType.И это SecondType: FirstType<SecondType> Если вы хотите напечатать ThirdType, вам нужно изменить свой метод следующим образом:

public void ShowType()
{       
    Console.WriteLine(GetType().Name);
}

и вызвать его из экземпляра класса:

ThirdType tt = new ThirdType();
tt.ShowType();
1 голос
/ 31 мая 2011

Вы можете объявить свой ThirdType следующим образом:

class ThirdType : FirstType<ThirdType>
{
}

или

class ThirdType : SecondType<ThirdType>
{
}

class SecondType<T> : FirstType<T>
{
}

В этом случае будет напечатано «ThirdType».Но я думаю, что это будет плохой практикой, лучшее решение, которое я вижу, описано в ответе Даниэль

0 голосов
/ 31 мая 2011

Конечно, просто добавьте Console.WriteLine("ThirdType") ;-)

Шучу - нет, это невозможно с вашей текущей иерархией объектов, потому что вы печатаете тип аргумента универсального типа (<T>), поэтомуТретий тип печатается только в том случае, если третий тип наследуется от FirstType<ThirdType>.

0 голосов
/ 31 мая 2011

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

Console.WriteLine(typeof(T).Name);

с

Console.WriteLine(this.GetType().Name);

this.GetType() вернет фактический тип объекта, в этом случае ThirdType.

И удалить static из метода. По крайней мере, если вы хотите убедиться, что это имеет какой-то смысл.

0 голосов
/ 31 мая 2011

Как Вы написали в своем коде

Console.WriteLine(typeof(T).Name);

и T здесь "SecondType", который вы передали во втором классе наследования.

благодарит за печать "SecondType"

Измените свой код следующим образом: может работать для вас

class ThirdType : SecondType<ThirdType>
{
}

class SecondType<T> : FirstType<T>
{
}

class FirstType<T> 
{
    public static void ShowType<T>()
    {       
        Console.WriteLine(typeof(T).Name);
    }
}

ThirdType.ShowType ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...