Вложенные классы.NET
Текущая библиотека классов, над которой я работаю, будет иметь базовый класс (Field) с более чем 50 конкретными типами "field", которые будут наследоваться от "Field" и вложены для обеспечения читабельности. Например...
abstract class Field
{
public int Length { get; set; }
public class FieldA : Field
{
public static void DoSomething()
{
Console.WriteLine("Did something.");
}
}
}
Пока все выглядит хорошо, и я могу использовать код, как показано:
class Program
{
static void Main(string[] args)
{
Field.FieldA.DoSomething();
}
}
Однако почему это работает? Что здесь происходит, что позволяет intellisense компилятора / IDE продолжать связывать эти "FieldA"?
class Program
{
static void Main(string[] args)
{
Field.FieldA.FieldA.FieldA.FieldA.FieldA.FieldA.FieldA.DoSomething();
}
}
Это ни в коем случае не нарушение приложений, но я подумал, что это было странно. Делает то же самое в Boo (это фактический язык, используемый для библиотеки).
3 ответа
Похоже, вы хотели что-то вроде:
abstract class Field
{
public int Length { get; set; }
}
public class FieldA : Field
{
public static void DoSomething()
{
Console.WriteLine("Did something.");
}
}
В противном случае вы определяете базовый класс с внутренним классом, который также получат наследники. Поэтому, когда вы наследуете от внешнего класса для создания внутреннего класса, вы запускаете цикл.
Field
имеет публичный вложенный класс с именемFieldA
FieldA
наследуется отField
- Таким образом, вы всегда можете получить доступ
FieldA
отFieldA
,
Ссылка не создает бесконечные цепочки, она просто указывает на один и тот же класс. ( некоторый тестовый код)
Когда вы получаете доступ FieldA.FieldA
, последний FieldA
доступен благодаря тому, что бывший FieldA
это пример Field
так что последний FieldA
на самом деле доступ Field.FieldA
FieldA наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который наследует ссылку на класс FieldA, который...
Это работает, потому что это то, что вы сказали, чтобы сделать.