Domanda

E 'vero in .NET che tutti tipi ereditano da System.Object.

Ciò che trovo paradossale, è un paio di metodi su System.Object - vale a dire

  • pubblico virtuale stringa ToString ();
  • pubblico virtuale bool Equals (Object objA, oggetto objB);

System.String è ereditato da System.Object:

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

System.Boolean è ereditato da System.Object:

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

Qual è la succedendo sotto le coperte che hanno permesso la classe System.Object per consentire sottoclassi per essere usati come tipi di ritorno sui suoi metodi? Come ha fatto questo codice mai compilato, come sembra che ci sia un riferimenti circolari. Stringa <-> Oggetto <->. Booleano

Sono sicuro che vedrò dichiarazioni, su "Che è come viene implementato", ma posso capire se questi tipi di ritorno sono stati "System.Object" s 'se stessi, e quindi una sottoclasse usato le implemenations di corda , bool e altri System.ValueTypes di dichiarare un nuovo classe di base.

Mi auguro che abbia un senso.

Grazie in anticipo,

Dominic

È stato utile?

Soluzione

E 'un grosso problema, una classe base può sempre fare riferimento sottoclassi. Per esempio, questo codice è perfettamente legale:

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

class B : A
{
}

Si noti che farebbe essere un problema se A e B sono stati definiti negli assiemi separati, perché ciò richiederebbe un riferimento complesso circolare, che non è consentito

Altri suggerimenti

Un riferimento circolare è solo un problema su più progetti, altrimenti genitore / rapporto bambino non sarebbe mai esistere su entrambi i lati sia.

In realtà, è non del tutto vero che tutti i tipi ereditano da Object. Si prega di consultare su questo .

Non vedo il problema di una classe base che restituisce un classe derivata.

Inoltre non vedo dipendenze circolari dal Object.ToString (); restituisce un oggetto String. La classe String deriva da oggetto, ma che importa? Se entrambi sono nella stessa assemblea, non c'è nessun problema.

In aggiunta a ciò che altri hanno detto si può anche derivare una classe da una classe base che utilizza la classe derivante da un parametro di tipo generico. Ci sono un sacco di usi pulito per questo modello.

public class A<T>
{
}

public class B : A<B>
{
}

Se volete vedere una dipendenza circolare nel framework .NET, quindi non guardare oltre System.dll, System.Xml.dll e System.Configuration.dll:

Come Microsoft ha creato queste assemblee è un mistero per me. A dire il vero, potrei inviare questo come un'altra domanda . ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top