【问题标题】:C# Object derivation [duplicate]C#对象派生[重复]
【发布时间】:2018-07-04 11:56:37
【问题描述】:

根据规范:

“.NET Framework 中的所有类都派生自 Object”

如果没有明确地将 Object 类写为父类,如何从对象基类派生类?

IE:

public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<string>, IEnumerable<char>, IEquatable<string> 

【问题讨论】:

  • 这是隐含的,因为根据定义它是正确的(“.NET Framework 中的所有类都派生自 Object”)。这有点像说“我所有的孩子都是人类”。我不必明确指定它——因为根据定义它是正确的。 换个角度想一想——如果那个规范是真的(它是真的),那么强制你指定它继承自对象的是什么?不会有任何好处 - 因此它不是必需的。
  • Base classes: "当class_type 包含在class_base 中时,它指定了正在声明的类的直接基类。如果类声明没有class_base,或者如果class_base 仅列出接口类型,直接基类假定为 object"
  • 好的,这个我可以理解,但是从技术的角度来看,这是如何获得的呢?
  • 想象一下,如果你明确地从 Object 继承,它将如何获得它。它以完全相同的方式获得 - 无需显式指定它从 Object 继承。 换句话说,它是隐式还是显式对其实现方式没有影响。
  • 写作class Foo { } 是写作class Foo : object { } 的简写。就这么简单。这是编译器的诡计!

标签: c# .net c#-4.0


【解决方案1】:

另一个注意事项:您可以访问的所有这些基本方法都在每个类/类型中实现:

Equals、ReferenceEquals、GetHashCode、GetType、ToString。

这意味着始终存在来自 System.Object 的隐藏继承。 “object”只是一个别名——当你在 VS 中选择“object”时,它也会突出显示所有 System.Object 类以指示身份(反之亦然)。它似乎很难在 C# 中实现,我想不可避免地要从“对象”继承。它是允许您访问 任何东西 的基础,无论它是什么 - 即使您几乎无法对它做任何事情而不将其放回。

object x = new *anything*;

另外,抽象类实例不能被赋值,但那是在'abstract'的末尾主动阻止它,而不是在'object'上接收它。

如果 object 可以以其他方式工作,则您必须从 'System.Object' 继承所有基类,这将是乏味且毫无意义的。无论如何,对象并不是要被排除在外的,因为它会导致巨大的损失,因为在有意义的情况下没有确定的方式来引用 things (今天我写的时候它对我来说确实如此)一个用于收集对象、过滤掉空值并以格式化字符串输出它们的 ToString() 以用于调试目的的类)。

另一个有趣的点是'object'可以被抽象化,这样object x = new object ();不再起作用。因为到底什么是对象?真的没什么,但还是有的。它的信息比 bool 变量产量少。但 C# 开发人员决定不这样做,这似乎更简单。也没有/没有好的/足够的理由来禁止它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 2023-03-05
    • 2019-12-09
    • 2017-10-11
    • 2015-04-26
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多