【问题标题】:Why is System.Object not abstract in .NET?为什么 System.Object 在 .NET 中不是抽象的?
【发布时间】:2010-10-03 19:13:36
【问题描述】:

我知道它通常用作锁定对象,但这真的足够吗? 什么意思

object o = new object();

非抽象类是代表实际对象的东西。 “asdasdf”是一个字符串。 “对象”类的实际实例是什么?这是没有意义的,OOP 明智的。我的问题是它的存在是否有一些实际原因(除了用作锁定对象之外)。

【问题讨论】:

    标签: .net oop


    【解决方案1】:

    回答这个问题最简单的方法是问另一个问题:Object 类有什么抽象的原因吗?既然没有理由让它是抽象的,那就不是。

    【讨论】:

    • 抽象的一个原因是它没有具体的目的。应该将没有具体目的的事物抽象化,以帮助我们人类更好地了解 API。
    • 如果每个接口都可以用不做任何/良性事情的方法来实例化,那么我们会在不应该使用它们时混淆自己。这就是为什么它们是抽象的。不过我想,它们对单元测试中的假货很有用。在我看来 object 是一个例外。
    • Scott,您的论点的问题在于接口指定了合同,但没有实现它;另一方面,Object 类不仅指定了契约,还提供了默认实现。
    • 我了解 Object 类提供了一个默认实现,但这不是它具体的原因。即使实现了所有方法,Object 类也可以标记为抽象类。
    【解决方案2】:

    有时您只需要一个对象,而不需要其他任何东西,例如在实现多线程锁之类的事情时使用随机引用类型。不使对象抽象允许在这些情况下使用。 Monitor.Enter 和 Monitor.Exit 类(这是 C# 中“lock”关键字的基础)可以获取任何给定对象的锁,而不管实现如何。

    【讨论】:

      【解决方案3】:

      对于一个类来说,抽象当然意味着它有一些需要实现的功能......

      System.Object 做了它需要做的一切,因此它不是抽象的。

      我认为您误解了为什么将事物抽象化,这是因为它们包含一些有用的功能,并且没有规定您如何实现其功能的某些部分。

      基本上它们是半成品类,就像一个模型套件,您可以对其进行自定义以按照您想要的方式工作,但您不必从头开始滚动整个东西。

      它们的存在并不是为了阻止您创建它们的实例。

      【讨论】:

        【解决方案4】:

        这实际上在 System.Windows.Forms 中使用了很多,其中创建了普通的旧 System.Object 实例作为每个 Control 实例字典的键,用于事件处理程序和属性值等内容。将其视为穷人的 DependencyProperty,但没有围绕它构建的所有机制(因此无需定义像 DependencyProperty 类这样的抽象)。

        CLR 甚至可能对优化普通旧 System.Object 实例的内存使用提供某种支持,因为只有几个场景可以有益地使用它们。

        【讨论】:

          【解决方案5】:

          它不应该有一个公共构造函数,而且我认为它应该是抽象的。对象类是所有 .net 对象的基础,它本身没有任何目的(好的,锁定......但我更喜欢有一个类 Lock : object 并且问题解决了)。 “因为它不需要抽象”的借口很糟糕。我们应该有理由使类具体而不是抽象。我们没有任何理由让它具体化,所以......它不应该,因为这个类的主要目的是“被所有其他类继承”。

          【讨论】:

          • “我们应该有理由使类具体而不是抽象。”为什么?为什么对象不应该简单地对域和职责建模,每个职责一个对象?那时什么都不需要抽象。
          【解决方案6】:

          是的,这就足够了。要么允许创建对象,要么必须为每个结构创建类,这些结构只是在寻找可以引用的静态指针。我的猜测是还有其他地方使用它。

          【讨论】:

            【解决方案7】:

            首先,假设对象类被声明为一个抽象,带有一些抽象方法,如toString、Equals等。这意味着在创建新类时必须强制重写此方法,因为对象类隐式继承到任何类。

            毕竟,在所有新类中强制编写代码以覆盖可能根本不需要多次的基本方法是没有任何意义的。如果你想创建大多数非抽象的方法,那么创建这样的类有什么意义呢?

            这就是为什么它是具体类而不是抽象类。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-01-08
              • 1970-01-01
              • 2012-07-04
              • 1970-01-01
              • 2020-07-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多