Почему System.Object не абстрактный в .NET?

Я знаю, что он обычно используется как объект блокировки, но это действительно достаточная причина? В чем смысл

object o = new object();

Не абстрактный класс - это то, что представляет собой реальные объекты. "asdasdf" - это строка. Каким может быть фактический экземпляр класса "объект"? Это не имеет смысла, ООП-мудрый. Мой вопрос в том, есть ли практическая причина его существования (помимо того, что он используется как объект блокировки).

Ответ 1

Иногда вам просто нужен объект, и ничего больше, например, при использовании случайного типа ссылок для таких вещей, как реализация многопоточных блокировок. Не допускать использования абстрактных объектов в таких ситуациях. Классы Monitor.Enter и Monitor.Exit(которые лежат в основе ключевого слова "блокировка" на С#) могут получить блокировку для любого данного объекта независимо от реализации.

Ответ 2

Самый простой способ ответить на этот вопрос - задать еще один вопрос: есть ли какая-либо причина для абстрактного класса Object? Поскольку нет причин для его абстрактного, это не так.

Ответ 3

Конечно, для класса, который должен быть абстрактным, означает, что он имеет некоторую функциональность, которая требует реализации...

System.Object делает все, что ему нужно, чтобы оно не было абстрактным.

Я думаю, вы неправильно понимаете, почему вещи сделаны абстрактными, потому что они содержат некоторые полезные функции и не диктуют, как вы реализуете некоторые части их функций.

По сути, они являются наполовину сделанными классами, такими как набор моделей, который вы настраиваете, чтобы работать так, как вы хотите, но вам не нужно откатывать все это с нуля.

Они не существуют, чтобы остановить вас от создания экземпляров из них.

Ответ 4

Это фактически используется совсем немного в System.Windows.Forms, где простые старые экземпляры System.Object создаются, чтобы действовать как ключи в словарях экземпляра Control для таких вещей, как обработчики событий и значения свойств. Подумайте об этом как о бедном человеке DependencyProperty, но без всякой техники, созданной вокруг него (и, следовательно, нет необходимости определять абстракцию, такую ​​как класс DependencyProperty).

CLR может даже иметь некоторую поддержку для оптимизации использования памяти простых старых экземпляров System.Object, поскольку есть только несколько сценариев, в которых их можно использовать выгодно.

Ответ 5

у него не должно быть публичного конструктора, и, я думаю, он должен быть абстрактным. Класс объекта является базой всех .net-объектов и не имеет никакой цели сам по себе (нормально, блокировка... но я предпочитаю иметь класс Lock: object и проблема решена). Извинение "потому что оно не обязательно должно быть абстрактным" является плохим. У нас должны быть причины, чтобы сделать классы конкретными, а не абстрактными. У нас нет никаких причин сделать это конкретным, поэтому... это не должно, потому что основная цель этого класса - "наследоваться всеми остальными классами".

Ответ 6

Да, этого достаточно. Либо вы разрешаете создание объекта, либо вам нужно создавать классы для каждой структуры, которые просто ищут статический указатель, на который можно ссылаться. Я предполагаю, что есть другие места, которые используются.

Ответ 7

Прежде всего, давайте предположим, что объектный класс объявлен как абстрактный с некоторым абстрактным методом, таким как toString, Equals и так далее. Это означает, что при создании нового класса необходимо принудительно переопределять эти методы, поскольку объектный класс неявно наследуется любому классу.

В конце концов, не было бы никакого смысла принудительно писать код во всех новых классах для переопределения базовых методов, которые могут не потребоваться много раз вообще. И если вы хотите создавать большинство методов с неабстрактными данными, тогда какой смысл создавать такие классы?

Вот почему это конкретный класс, а не абстрактный.