Как System.Object может использовать подклассы в качестве возвращаемых типов? - PullRequest
1 голос
/ 22 августа 2009

В .NET верно, что все типы наследуются от System.Object.

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

  • публичная виртуальная строка ToString ();
  • публичный виртуальный bool Равен (объект objA, объект objB);

System.String наследуется от System.Object:

[Serializable]
public class String : Object { /*...*/ }

System.Boolean наследуется от System.Object:

[Serializable]
public struct Boolean : Object { /*....*/ }

Что происходит под прикрытием, что позволило классу System.Object разрешить использование подклассов в качестве возвращаемых типов в его методах? Как этот код когда-либо компилировался, так как там, кажется, есть циклические ссылки. String <-> Object <-> Boolean.

Я уверен, что увижу операторы, "вот как это реализовано", но я могу понять, были ли эти возвращаемые типы самими "System.Object", а затем подкласс использовал реализации строки , bool и другие System.ValueTypes для объявления нового базового класса.

Надеюсь, это имеет смысл.

Заранее спасибо,

Dominic

Ответы [ 6 ]

7 голосов
/ 22 августа 2009

Ничего страшного, базовый класс всегда может ссылаться на подклассы. Например, этот код совершенно легален:

class A
{
    public B CreateB();
    {
        return new B();
    }
}

class B : A
{
}

Обратите внимание, что будет проблемой, если A и B определены в отдельных сборках, поскольку для этого потребуется ссылка на круглую сборку, что недопустимо

2 голосов
/ 22 августа 2009

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

2 голосов
/ 22 августа 2009

Циркулярная ссылка является проблемой только для нескольких проектов, в противном случае отношения между родителями и детьми никогда не будут существовать с обеих сторон.

0 голосов
/ 22 августа 2009

В дополнение к тому, что сказали другие, вы также можете получить класс из базового класса, который использует производный класс в качестве параметра универсального типа. Есть много аккуратных применений для этого шаблона.

public class A<T>
{
}

public class B : A<B>
{
}
0 голосов
/ 22 августа 2009

Если вы хотите видеть циклическую зависимость в .NET Framework, то смотрите не дальше, чем System.dll, System.Xml.dll и System.Configuration.dll:

Как Microsoft создала эти сборки, для меня загадка. На самом деле, я мог бы опубликовать это как другой вопрос ...

0 голосов
/ 22 августа 2009

Я не вижу проблемы возврата базового класса производному классу.

Более того, я не вижу циклических зависимостей, поскольку Object.ToString (); возвращает объект String. Класс String наследуется от объекта, но что с того? Если оба находятся в одной сборке, проблем нет.

...