Как System.Object может использовать подклассы в качестве возвращаемых типов?

StackOverflow https://stackoverflow.com/questions/1316442

  •  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 создавала эти сборки, для меня загадка.На самом деле, я мог бы опубликовать это как Другой вопрос...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top