在.NET中,所有类型都从System.Object继承。
我发现矛盾,是System.Object上的一些方法 - 即
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 基类。
我希望这是有道理的。
提前致谢,
星
答案 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.dll
,System.Xml.dll
和System.Configuration.dll
:
微软如何创建这些程序集对我来说是一个谜。实际上,我可能会将其发布为another question ...
答案 5 :(得分:0)
除了其他人所说的,您还可以从使用派生类作为泛型类型参数的基类派生类。这种模式有很多巧妙的用途。
public class A<T>
{
}
public class B : A<B>
{
}