代码之家  ›  专栏  ›  技术社区  ›  Arseny

为什么Object.GetType()不是虚拟的?

  •  16
  • Arseny  · 技术社区  · 15 年前

    代码示例取自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()成为虚拟的(至少它是虚拟的)是合乎逻辑的吗?有人能解释一下吗?

    5 回复  |  直到 15 年前
        1
  •  17
  •   this. __curious_geek    15 年前

    因为.Net framework不希望您重写GetType()方法和 spoof 关于类型。

    假设您可以重写该方法,除了返回实例的类型之外,您还希望它做什么。当您重写每个类的方法以返回实例的类型时,您不会违反DRY。

        2
  •  3
  •   Kelon    15 年前

    GetType返回对象的实际类型。这让我们知道我们真正传递给'our'函数的对象是什么。框架的许多方法都需要它来确定它们自己的功能——在大多数情况下是为了获得这个类的属性。 如果框架失去了确定物体真实类型的可能性, 物体会松动这种类型 也。

    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
    */
    
        3
  •  3
  •   Dr Snooze    13 年前

    虽然确实不能重写object.GetType()方法,但可以使用“new”完全重载它,从而欺骗另一个已知类型。这很有趣,但是,我还没有弄清楚如何从头开始创建“Type”对象的实例,所以下面的示例假装是另一种类型。

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

    在创建此的实例之后,(new NotAString()).GetType()将返回字符串的类型。

        4
  •  2
  •   Akshay J    15 年前

    如果 GetType() 是虚拟的,一个名为 HumanBeing 可以重写它并返回表示 Robot 这就是所谓的欺骗和防止这是一个主要特点的CLR所谓的类型安全。

        5
  •  0
  •   Community Mohan Dere    8 年前

    answer ,以便“从头开始创建“Type”对象的实例”:

    public class NotAString
    {
        public new Type GetType()
        {
            return typeof(string);
        }
    }