Pregunta

Es cierto que en .NET todos tipos heredan de System.Object.

Lo que me parece paradójico, es de unos métodos de System.Object - es decir,

  • pública virtual cadena ToString ();
  • público virtual bool equals (Object objA, objeto objB);

System.String se hereda de System.Object:

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

System.Boolean se hereda de System.Object:

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

Lo que está pasando el debajo de las sábanas que permitieron que la clase System.Object para permitir subclases para ser utilizados como tipos de retorno sobre sus métodos? ¿Cómo este código cada vez compilado, ya que parece ser un referencias circulares. Cadena <-> Objeto <->. Boole

Estoy seguro de que voy a ver las declaraciones, en "esa es la forma en que se implementa", pero puedo entender si estos tipos de retorno eran "System.Object" 's mismos, y luego una sub-clase usado los implemenations de cuerda , bool y otros System.ValueTypes para declarar un nueva clase base.

Espero que tiene sentido.

Gracias de antemano,

Dominic

¿Fue útil?

Solución

No es un gran problema, una clase base siempre se puede hacer referencia a las subclases. Por ejemplo, este código es perfectamente legal:

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

class B : A
{
}

Tenga en cuenta que haría ser un problema si A y B se definen en conjuntos separados, porque eso requeriría una referencia de ensamblado circular, que no está permitido

Otros consejos

Una referencia circular es sólo un problema a través de múltiples proyectos, de lo contrario padre / hijo no tendría relación alguna vez llega a ambos lados tampoco.

En realidad, es no del todo cierto que todos los tipos heredan del objeto. Por favor, vea en este .

No veo el problema de una clase base devolver una clase derivada.

Además no veo dependencias circulares desde Object.ToString (); devuelve un objeto de cadena. La clase String se deriva del objeto, pero ¿y qué? Si ambos están en el mismo conjunto, no hay ningún problema.

Además de lo que otros han dicho que también se puede derivar una clase de una clase base que utiliza la clase derivada como un parámetro de tipo genérico. Hay una gran cantidad de usos ordenadas para este patrón.

public class A<T>
{
}

public class B : A<B>
{
}

Si usted quiere ver una dependencia circular en el marco .NET, entonces no busque más allá System.dll, System.Xml.dll y System.Configuration.dll:

Como Microsoft creó estas asambleas es un misterio para mí. En realidad, podría publicar esto como otra pregunta . ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top