почему Object.GetType () не является виртуальным? - PullRequest
17 голосов
/ 15 июля 2010

пример кода, взятый из MSDN

public class Test {
public static void Main() {
  MyBaseClass myBase = new MyBaseClass();
  MyDerivedClass myDerived = new MyDerivedClass();
  object o = myDerived;
  MyBaseClass b = myDerived;

  Console.WriteLine("mybase: Type is {0}", myBase.GetType());
  Console.WriteLine("myDerived: Type is {0}", myDerived.GetType());
  Console.WriteLine("object o = myDerived: Type is {0}", o.GetType());
  Console.WriteLine("MyBaseClass b = myDerived: Type is {0}", b.GetType());   }}

/*
This code produces the following output.
mybase: Type is MyBaseClass
myDerived: Type is MyDerivedClass
object o = myDerived: Type is MyDerivedClass
MyBaseClass b = myDerived: Type is MyDerivedClass 
*/

Так было бы логично сделать GetType () виртуальным, по крайней мере, он работает как виртуальный?Кто-нибудь может объяснить это?И другой вопрос. Есть ли какие-либо другие методы в NET Framework, которые имеют поведение, подобное GetType?

Ответы [ 5 ]

17 голосов
/ 15 июля 2010

потому что .Net Framework не хочет, чтобы вы переопределяли метод GetType () и spoof о типе.

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

2 голосов
/ 15 марта 2013

Хотя верно, что вы не можете переопределить метод object.GetType (), вы можете использовать «new», чтобы полностью перегрузить его, тем самым подделав другой известный тип. Это интересно, однако, я не выяснил, как создать экземпляр объекта «Тип» с нуля, поэтому приведенный ниже пример претендует на то, чтобы быть другим типом.

public class NotAString
{
    private string m_RealString = string.Empty;
    public new Type GetType()
    {
        return m_RealString.GetType();
    }
}

После создания экземпляра этого (new NotAString ()). GetType () действительно вернет тип для строки.

2 голосов
/ 17 марта 2011

Если GetType() было виртуальным, класс с именем HumanBeing может переопределить его и вернуть объект Type, представляющий Robot, который называется спуфингом, и предотвращение этого является одной из основных функций CLR, называемой Type Safety.

2 голосов
/ 15 июля 2010

GetType возвращает фактический тип объекта.Это позволяет нам узнать, какой объект мы действительно передали функции «наша».Многие методы фреймворка нуждаются в этом для определения собственной функциональности - в большинстве случаев для получения атрибутов этого класса.Если Framework потеряет возможность определять реальный тип объекта, объект потеряет и этот тип .

Если вы хотите знать тип, используемый в области действия вашего методатип, который вы объявили или выбрали компилятором - вы можете добавить довольно простой метод расширения:

public static Type GetCurrentType<T>(this T obj)
{
    return typeof(T);
}

public static void Main()
{
  MyBaseClass myBase = new MyBaseClass();
  MyDerivedClass myDerived = new MyDerivedClass();
  object o = myDerived;
  MyBaseClass b = myDerived;

  Console.WriteLine("mybase: Type is {0}", myBase.GetCurrentType());
  Console.WriteLine("myDerived: Type is {0}", myDerived.GetCurrentType());
  Console.WriteLine("object o = myDerived: Type is {0}", o.GetCurrentType());
  Console.WriteLine("MyBaseClass b = myDerived: Type is {0}", b.GetCurrentType());
}

/*
This code produces the following output.
mybase: Type is ValidatorTest.MyBaseClass
myDerived: Type is ValidatorTest.MyDerivedClass
object o = myDerived: Type is System.Object
MyBaseClass b = myDerived: Type is ValidatorTest.MyBaseClass
*/
0 голосов
/ 01 октября 2014

Изменение ответа доктора Снуза , чтобы "создать экземпляр объекта" Тип "с нуля":

public class NotAString
{
    public new Type GetType()
    {
        return typeof(string);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...