Frage

Es ist wahr, in .NET, dass alle Typen erben von System.Object.

Was finde ich paradox, ist ein paar Methoden auf System.Object - nämlich

  • public virtual string ToString ();
  • public virtual Bool Equals (Objekt objA, Objekt objB);

System.String von System.Object geerbte:

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

System.Boolean von System.Object geerbte:

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

Was wird die unter der Decke auf, die die System.Object-Klasse erlaubten Unterklassen zu ermöglichen, als Rückgabetypen auf ihren Methoden angewandt werden? Wie hat dieser Code jemals zusammengestellt, da es eine zirkuläre Referenzen zu sein scheint. String <-> Object <->. Boolean

Ich bin sicher, dass ich Anweisungen sehen, auf „das ist, wie es umgesetzt wird“, aber ich kann verstehen, wenn diese Rückgabetypen „System.Object“ 's waren selbst, und dann eine Unterklasse verwendet, um die implemenations der Zeichenfolge , bool und andere System.ValueTypes a neue Basisklasse zu erklären.

Ich hoffe, das macht Sinn.

Vielen Dank im Voraus,

Dominic

War es hilfreich?

Lösung

Es ist keine große Sache, eine Basisklasse kann immer Subklassen verweisen. Zum Beispiel ist dieser Code vollkommen legal:

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

class B : A
{
}

Beachten Sie, dass es würde ist ein Problem, wenn A und B in getrennten Baugruppen definiert wurden, denn das ist eine kreisförmige Anordnung Bezug erfordern würde, was nicht erlaubt ist

Andere Tipps

Eine kreisförmige Referenz ist nur ein Problem für mehrere Projekte, sonst Eltern / Kind-Beziehung nicht immer entweder auf beiden Seiten existieren würde.

Eigentlich ist es nicht ganz richtig, dass alle Arten von Object erben. Bitte sehen Eric Lippert Blogeintrag rel="nofollow auf dieser .

Ich sehe nicht das Problem einer Basis-Klasse eine abgeleitete Klasse zurück.

Darüber hinaus nicht ich zirkuläre Abhängigkeiten seit Object.ToString () sehen; gibt ein String-Objekt. Die String-Klasse leitet sich von dem Objekt, aber so was? Wenn beide in der gleichen Baugruppe sind, gibt es kein Problem.

Zusätzlich zu dem, was andere gesagt haben Sie auch eine Klasse von einer Basisklasse ableiten kann, der die Ableitungs Klasse als generischen Typparameter verwendet. Es gibt eine Menge ordentlich Anwendungen für dieses Muster.

public class A<T>
{
}

public class B : A<B>
{
}

Wenn Sie eine zirkuläre Abhängigkeit in dem .NET-Framework sehen möchten, dann suchen Sie nicht weiter als System.dll, System.Xml.dll und System.Configuration.dll:

Wie Microsoft erstellt diese Baugruppen ist mir ein Rätsel. Eigentlich könnte ich schreiben dies als eine andere Frage . ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top