为什么System.Object在.NET中不是抽象的?

时间:2009-01-27 16:25:35

标签: .net oop

我知道它通常被用作锁定对象,但这真的是充分的理由吗?

是什么意思?
object o = new object();

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

7 个答案:

答案 0 :(得分:13)

回答这个问题的最简单方法是问另一个问题:Object类是否有任何抽象概念?由于它没有理由是抽象的,所以不是。

答案 1 :(得分:10)

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

答案 2 :(得分:8)

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

System.Object完成所需的一切,因此它不是抽象的。

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

基本上它们是半制造的类,就像模型套件一样,你可以自定义按照你想要的方式工作,但你不必从头开始整个过程​​。

它们不存在阻止您创建它们的实例。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

首先,假设使用某些抽象方法(例如toString,Equals等)将对象类声明为抽象。这意味着在创建新类时必须强制重写此方法,因为对象类隐式继承到任何类。

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

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