Как System.Object может использовать подклассы в качестве возвращаемых типов?
-
19-09-2019 - |
Вопрос
Это правда в .NET, что все типы наследуются от System.Object.
Что мне кажется парадоксальным, так это несколько методов System.Object, а именно:
- общедоступный виртуальный нить Нанизывать();
- общедоступный виртуальный логическое значение Равно (объект objA, объект objB);
System.String наследуется от System.Object:
[Serializable]
public class String : Object { /*...*/ }
System.Boolean унаследован от System.Object:
[Serializable]
public struct Boolean : Object { /*....*/ }
Что происходит под прикрытием того, что класс System.Object позволяет использовать подклассы в качестве возвращаемых типов своих методов?Как этот код когда-либо компилировался, поскольку, похоже, существуют циклические ссылки.Строка <-> Объект <-> Логическое значение.
Я уверен, что увижу утверждения «вот как это реализовано», но я могу понять, были ли эти возвращаемые типы самими «System.Object», а затем подкласс использовал реализации string, bool и другие System.ValueTypes для объявления новый базовый класс.
Надеюсь это имеет смысл.
Заранее спасибо,
Доминик
Решение
В этом нет ничего страшного, базовый класс всегда может ссылаться на подклассы.Например, этот код совершенно законен:
class A
{
public B CreateB();
{
return new B();
}
}
class B : A
{
}
Обратите внимание, что это бы быть проблемой, если A и B были определены в отдельных сборках, поскольку для этого потребуется циклическая ссылка на сборку, что не допускается.
Другие советы
Циклическая ссылка является проблемой только в нескольких проектах, иначе отношения родитель/потомок никогда не существовали бы с обеих сторон.
На самом деле, это нет совершенно верно, что все типы наследуются от Object.Пожалуйста, посмотрите Эрика Липперта запись в блоге об этом.
Я не вижу проблемы, когда базовый класс возвращает производный класс.
Более того, я не вижу циклических зависимостей, поскольку Object.ToString();возвращает объект String.Класс String является производным от объекта, но что с того?Если оба находятся в одной сборке, проблем нет.
В дополнение к тому, что говорили другие, вы также можете получить класс из базового класса, который использует производный класс в качестве параметра универсального типа.У этого узора есть множество вариантов использования.
public class A<T>
{
}
public class B : A<B>
{
}
Если вы хотите увидеть циклическую зависимость в .NET Framework, не ищите ничего, кроме System.dll
, System.Xml.dll
и System.Configuration.dll
:
Как Microsoft создавала эти сборки, для меня загадка.На самом деле, я мог бы опубликовать это как Другой вопрос...