1

在 .NET 中确实所有类型都继承自 System.Object。

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

  • 公共虚拟字符串ToS​​tring();
  • 公共虚拟布尔等于(对象objA,对象objB);

System.String 继承自 System.Object:

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

System.Boolean 继承自 System.Object:

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

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

我相信我会看到关于“这就是它的实现方式”的声明,但我可以理解这些返回类型是否是“System.Object”本身,然后一个子类使用了字符串、布尔和其他 System.ValueTypes 来声明一个的基类。

我希望这是有道理的。

提前致谢,

多米尼克

4

6 回答 6

7

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

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

class B : A
{
}

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

于 2009-08-22T17:01:51.007 回答
2

实际上,并非所有类型都继承自 Object。请参阅 Eric Lippert 的博客条目

于 2009-08-22T18:09:56.283 回答
2

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

于 2009-08-22T17:05:06.540 回答
0

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

此外,我没有看到自 Object.ToString(); 以来的循环依赖关系;返回一个字符串对象。String 类派生自对象,但那又如何呢?如果两者都在同一个程序集中,则没有问题。

于 2009-08-22T17:03:36.760 回答
0

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

Microsoft 如何创建这些程序集对我来说是个谜。实际上,我可能会将其作为另一个问题发布...

于 2009-08-22T17:18:30.083 回答
0

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

public class A<T>
{
}

public class B : A<B>
{
}
于 2009-08-22T19:57:03.960 回答