Вложенный частичный класс
internal partial class Class1
{
private class Class2 : ISomething, ISomethingElse
{
private class Class3 : ISomething
{
}
}
}
Я хочу, чтобы Class3 сам размещал еще один закрытый Class4, но это сделало бы Class3 слишком большим, поэтому я хочу сделать Part3 частичным. Я знаю, как это сделать с не-вложенным классом. Как вы вносите вложенный класс в отдельный файл?
Ответы
Ответ 1
В этой статье указывается, что можно сделать частичные вложенные классы, даже если их родительские классы не являются частичными. Но тогда вы не можете отделить их в нескольких файлах, поэтому я думаю, что вам тоже нужно сделать частичный класс Class2 и расколоть так же, как и с классами первого уровня, сохраняя иерархию частичных классов.
Я действительно надеюсь, что этот вопрос просто из-за любопытства.
EDIT: просто попробовал - работает нормально.
file1.cs
partial class c1 {
partial class c2 {
class c3 {
}
}
}
file2.cs
partial class c1 {
partial class c2 {
}
}
Ответ 2
Если вложенный класс должен быть по какой-либо причине секционирован, то также должен быть разделен класс владельца. Вложенный код класса - это также код класса владельца - это отношение композиции.
Таким образом, извлечение части вложенного класса означает также извлечение части его владельца одновременно.
В свою очередь нам нужно "увидеть полный путь" для каждого частичного класса , чтобы компилятор мог идентифицировать полностью определенный тип.
То же самое и с пространствами имен - в отличие от классов, они как-то частично неявно, потому что мы не ожидаем наличия всего пространства имен в одном файле, в то время как мы обычно делаем это для классов, особенно вложенных.
Так что обычно нам нужно писать в файл с частями наших вложенных классов
MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassA
MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassB
определил что-то вроде:
namespace MyTopNamespace
{
namespace MyLevel2Namespace
{
partial class MyTopLevelClass
{
partial class MyNestedClassA
{
// Part of definition for our nested class:
// MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassA
}
class MyOtherNestedClassNotPartitioned
{
...
}
partial class MyNestedClassB
{
// Part of definition for our nested class:
// MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassB
}
}
}
}
а в другом файле с другой частью вложенного класса суффикс 'A' определил что-то вроде:
namespace MyTopNamespace
{
namespace MyLevel2Namespace
{
partial class MyTopLevelClass
{
partial class MyNestedClassA
{
// Another part of definition for our nested class:
// MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassA
}
}
}
}
а в еще одном файле с другой частью вложенного класса, суффикс 'B' определил что-то вроде:
namespace MyTopNamespace
{
namespace MyLevel2Namespace
{
partial class MyTopLevelClass
{
partial class MyNestedClassB
{
// Another part of definition for our nested class:
// MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassB
}
}
}
}
Или у нас могут быть другие файлы с определенными частями обоих вложенных классов и т.д., но нам всегда нужно полностью указать, где находится тип класса.