Два частных подкласса в один публичный класс

Я получил проект на C#, где мне нужно иметь базовый класс и два подкласса, и я хочу, чтобы подклассы были частными по отношению к базовым классам. Вот как это выглядит:

public class MyBaseClass
{
    public void doMyWork()
    {
        doSubClass1();
        doSubClass2();
    }
}

private class MySubClass1
{
    public void doSubClass1()
    {
        //Do stuff
    }
}

private class MySubClass2
{
    public void doSubClass2()
    {
        //Do stuff
    }
}

Как я могу заставить это работать?

2 ответа

Решение

Больно ли, если сами классы не настолько приватны, но все еще находятся в вашей базе и недоступны снаружи?

public class MyBaseClass
{
    private readonly MySubClass1 _sub1 = new MySubClass1();
    private readonly MySubClass2 _sub2 = new MySubClass2();

    public void DoMyWork()
    {
        _sub1.DoSubClass1();
        _sub2.DoSubClass2();
    }
}

public class MySubClass1
{
    public void DoSubClass1() { /* Do stuff */ }
}

public class MySubClass2
{
    public void DoSubClass2() { /* Do stuff */ }
}

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

Файл Class1.cs

public partial class MyBaseClass
{
    public void DoMyWork()
    {
        (new MySubClass1()).DoSubClass1();
        (new MySubClass2()).DoSubClass2();
    }
}

Файл Class2.cs

public partial class MyBaseClass
{
    private class MySubClass1
    {
        public void DoSubClass1() { /* Do stuff */ }
    }
}

Файл Class3.cs

public partial class MyBaseClass
{
    private class MySubClass2
    {
        public void DoSubClass2() { /* Do stuff */ }
    }
}   

Но все же не совсем понятно, чего вы здесь добиваетесь.

Если вы поместите свои подклассы в базовый класс, базовый класс сможет получить к ним доступ. Чтобы использовать ваш пример, это было бы так:

public class MyBaseClass
{
    public void doMyWork()
    {
        new MySubClass1().doSubClass1();
        new MySubClass2().doSubClass2();
    }

    private class MySubClass1
    {
        public void doSubClass1()
        {
            //Do stuff
        }
    }

    private class MySubClass2
    {
        public void doSubClass2()
        {
            //Do stuff
        }
    }

}

Обратите внимание, что все, что я сделал, это переместил последний } ко дну.

Другие вопросы по тегам