Вложенный частичный класс

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
            }
       }
    }
}

Или у нас могут быть другие файлы с определенными частями обоих вложенных классов и т.д., но нам всегда нужно полностью указать, где находится тип класса.