System.Object如何使用子类作为返回类型?

时间:2009-08-22 16:52:07

标签: .net inheritance clr paradox

在.NET中,所有类型都从System.Object继承。

我发现矛盾,是System.Object上的一些方法 - 即

  • public virtual string ToString();
  • public virtual bool Equals(object objA,object objB);

System.String继承自System.Object:

[Serializable]
public class String : Object { /*...*/ }

System.Boolean继承自System.Object:

[Serializable]
public struct Boolean : Object { /*....*/ }

允许System.Object类允许子类在其方法上用作返回类型的内幕是什么?这个代码是如何编译的,因为似乎有一个循环引用。字符串< - >对象< - >布尔值。

我确信我会看到关于“它是如何实现的”的语句,但是我可以理解这些返回类型是否是“System.Object”本身,然后一个子类使用了字符串的实现,bool和其他System.ValueTypes声明 new 基类。

我希望这是有道理的。

提前致谢,

6 个答案:

答案 0 :(得分:7)

没什么大不了的,基类总能引用子类。例如,这段代码完全合法:

class A
{
    public B CreateB();
    {
        return new B();
    }
}

class B : A
{
}

请注意,如果A和B在单独的程序集中定义,成为问题,因为这需要循环程序集引用,这是不允许的

答案 1 :(得分:2)

循环引用只是多个项目的问题,否则双方都不会存在父/子关系。

答案 2 :(得分:2)

实际上,所有类型都从Object继承,完全正确。请参阅Eric Lippert的blog entry on this

答案 3 :(得分:0)

我没有看到基类返回派生类的问题。

此外,由于Object.ToString(),我没有看到循环依赖。返回一个String对象。 String类派生自object,但是又是什么?如果两者都在同一个组件中,则没有问题。

答案 4 :(得分:0)

如果您想在.NET框架中看到循环依赖关系,那么请查看System.dllSystem.Xml.dllSystem.Configuration.dll

微软如何创建这些程序集对我来说是一个谜。实际上,我可能会将其发布为another question ...

答案 5 :(得分:0)

除了其他人所说的,您还可以从使用派生类作为泛型类型参数的基类派生类。这种模式有很多巧妙的用途。

public class A<T>
{
}

public class B : A<B>
{
}