2009-08-22 14 views
1

Es ist in .NET wahr, dass alle Typen von System.Object erben.Wie kann System.Object Unterklassen als Rückgabetypen verwenden?

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

  • public virtual String ToString();
  • öffentlich virtuell bool Gleich (Objekt objA, Objekt objB);

System.String von System.Object geerbt:

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

System.Boolean von System.Object vererbt wird:

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

Was unter der Decke die los ist, die erlaubt die System.Object-Klasse, damit Unterklassen als Rückgabetypen für ihre Methoden verwendet werden können? Wie wurde dieser Code jemals kompiliert, da scheint es einen Zirkelbezug zu geben. String < -> Objekt < -> Boolesch.

Ich bin sicher, ich werde Aussagen sehen, auf "so ist es implementiert", aber ich kann verstehen, wenn diese Rückgabetypen waren "System.Object" selbst, und dann eine Unterklasse verwendet die Implementierungen von string, bool und andere System.ValueTypes, um eine neue Basisklasse zu deklarieren.

Ich hoffe, dass das Sinn macht.

Vielen Dank im Voraus,

Dominic

Antwort

7

Es ist keine große Sache, kann eine Basisklasse 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 ein Problem sein, wenn A und B in getrennten Baugruppen definiert wurden, denn das ist eine kreisförmige Anordnung Bezug erfordern würde, die nicht

erlaubt ist
+0

Sie möchten bei http://stackoverflow.com/questions/1316518/how-did-microsoft-create-assemblies-that-have-circular-references einen Blick nehmen, wo es, dass, während Kreis demonstriert Abhängigkeiten werden von der IDE blockiert, sie können mit dem Befehlszeilencompiler (csc.exe) ausgeführt werden. –

+0

Ich meine kreisförmige Abhängigkeiten zwischen Baugruppen ... –

0

Ich sehe nicht das Problem einer Basisklasse, die eine abgeleitete Klasse zurückgibt.

Darüber hinaus sehe ich keine zirkulären Abhängigkeiten seit Object.ToString(); gibt ein String-Objekt zurück. Die String-Klasse leitet sich vom Objekt ab, aber was? Wenn beide in derselben Baugruppe sind, gibt es kein Problem.

+0

Es war mehr eine Hühner/Ei-Situation, das hat mich verwirrt? –

2

Ein Zirkelverweis ist nur ein Problem in mehreren Projekten, sonst wäre die Eltern/Kind-Beziehung auch nicht auf beiden Seiten vorhanden.

2

Eigentlich ist es nicht völlig wahr, dass alle Typen von Object erben. Bitte sehen Sie Eric Lippert blog entry on this.

0

Zusätzlich zu dem, was andere gesagt haben, können Sie auch eine Klasse von einer Basisklasse ableiten, die die Ableitungsklasse als generischen Typparameter verwendet. Es gibt viele nette Anwendungen für dieses Muster.

public class A<T> 
{ 
} 

public class B : A<B> 
{ 
} 
Verwandte Themen