c# nested class
Clases anidadas de.NET (3)
-
Field
tiene una clase pública anidada llamadaFieldA
-
FieldA
hereda deField
- por lo tanto, siempre puede acceder a
FieldA
desdeFieldA
.
La referencia no está creando cadenas infinitas, simplemente está apuntando a la misma clase. ( algún código de prueba )
Cuando accede a FieldA.FieldA
, este último FieldA
es accesible debido a que el antiguo FieldA
es una instancia de Field
por lo que el último FieldA
realmente accede a Field.FieldA
La biblioteca de clases actual en la que estoy trabajando tendrá una clase base (Campo) con más de 50 tipos específicos de "campos" que heredarán de "Campo" y anidados para mantener la legibilidad. Por ejemplo...
abstract class Field
{
public int Length { get; set; }
public class FieldA : Field
{
public static void DoSomething()
{
Console.WriteLine("Did something.");
}
}
}
Hasta ahora todo se ve bien y puedo usar el código como se muestra:
class Program
{
static void Main(string[] args)
{
Field.FieldA.DoSomething();
}
}
Sin embargo, ¿por qué funciona esto también? ¿Qué está sucediendo aquí que permite al compilador / IDE intellisense continuar encadenando estos "FieldA"?
class Program
{
static void Main(string[] args)
{
Field.FieldA.FieldA.FieldA.FieldA.FieldA.FieldA.FieldA.DoSomething();
}
}
No es una aplicación que se rompa de ninguna manera, pero pensó que era peculiar. Hace lo mismo en Boo (que es el lenguaje real que se usa para la biblioteca).
FieldA hereda una referencia a la clase FieldA que hereda una referencia a la clase FieldA que hereda una referencia a la clase FieldA que hereda una referencia a la clase FieldA que hereda una referencia a la clase FieldA que hereda una referencia a la clase FieldA que hereda una referencia a la clase FieldA que ...
Funciona porque eso es lo que le dijiste que hiciera.
Parece que querías algo así como:
abstract class Field
{
public int Length { get; set; }
}
public class FieldA : Field
{
public static void DoSomething()
{
Console.WriteLine("Did something.");
}
}
De lo contrario, estás definiendo una clase base con una clase interna, que los herederos también obtendrán. Entonces, cuando heredas de la clase externa para formar la clase interna, estás comenzando un ciclo.