【发布时间】:2010-10-03 19:13:36
【问题描述】:
我知道它通常用作锁定对象,但这真的足够吗? 什么意思
object o = new object();
非抽象类是代表实际对象的东西。 “asdasdf”是一个字符串。 “对象”类的实际实例是什么?这是没有意义的,OOP 明智的。我的问题是它的存在是否有一些实际原因(除了用作锁定对象之外)。
【问题讨论】:
我知道它通常用作锁定对象,但这真的足够吗? 什么意思
object o = new object();
非抽象类是代表实际对象的东西。 “asdasdf”是一个字符串。 “对象”类的实际实例是什么?这是没有意义的,OOP 明智的。我的问题是它的存在是否有一些实际原因(除了用作锁定对象之外)。
【问题讨论】:
回答这个问题最简单的方法是问另一个问题:Object 类有什么抽象的原因吗?既然没有理由让它是抽象的,那就不是。
【讨论】:
有时您只需要一个对象,而不需要其他任何东西,例如在实现多线程锁之类的事情时使用随机引用类型。不使对象抽象允许在这些情况下使用。 Monitor.Enter 和 Monitor.Exit 类(这是 C# 中“lock”关键字的基础)可以获取任何给定对象的锁,而不管实现如何。
【讨论】:
对于一个类来说,抽象当然意味着它有一些需要实现的功能......
System.Object 做了它需要做的一切,因此它不是抽象的。
我认为您误解了为什么将事物抽象化,这是因为它们包含一些有用的功能,并且没有规定您如何实现其功能的某些部分。
基本上它们是半成品类,就像一个模型套件,您可以对其进行自定义以按照您想要的方式工作,但您不必从头开始滚动整个东西。
它们的存在并不是为了阻止您创建它们的实例。
【讨论】:
这实际上在 System.Windows.Forms 中使用了很多,其中创建了普通的旧 System.Object 实例作为每个 Control 实例字典的键,用于事件处理程序和属性值等内容。将其视为穷人的 DependencyProperty,但没有围绕它构建的所有机制(因此无需定义像 DependencyProperty 类这样的抽象)。
CLR 甚至可能对优化普通旧 System.Object 实例的内存使用提供某种支持,因为只有几个场景可以有益地使用它们。
【讨论】:
它不应该有一个公共构造函数,而且我认为它应该是抽象的。对象类是所有 .net 对象的基础,它本身没有任何目的(好的,锁定......但我更喜欢有一个类 Lock : object 并且问题解决了)。 “因为它不需要抽象”的借口很糟糕。我们应该有理由使类具体而不是抽象。我们没有任何理由让它具体化,所以......它不应该,因为这个类的主要目的是“被所有其他类继承”。
【讨论】:
是的,这就足够了。要么允许创建对象,要么必须为每个结构创建类,这些结构只是在寻找可以引用的静态指针。我的猜测是还有其他地方使用它。
【讨论】:
首先,假设对象类被声明为一个抽象,带有一些抽象方法,如toString、Equals等。这意味着在创建新类时必须强制重写此方法,因为对象类隐式继承到任何类。
毕竟,在所有新类中强制编写代码以覆盖可能根本不需要多次的基本方法是没有任何意义的。如果你想创建大多数非抽象的方法,那么创建这样的类有什么意义呢?
这就是为什么它是具体类而不是抽象类。
【讨论】: