Это плохая идея инициализировать все производные переменные-члены в базовом классе? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть несколько производных классов, которые наследуются от базового класса.Каждый производный класс по-прежнему имеет уникальных членов.Один из этих производных классов должен иметь доступ ко всем членам другого производного класса.Моя цель в решении этой проблемы - написать как можно меньше кода.

Было бы небрежно или неуместно инициализировать все члены производных классов в базовом классе, чтобы один из производных классов мог получить доступ к этим членамвместо инициализации их в указанном производном классе?

Предлагаемый подход:

public class BaseClass {
    public BaseClass() {
        ...
        der1Initializer = Der1Initializer(new Factory1());
        der2Initializer = Der1Initializer(new Factory2());

        List initializers = new List(){ der1Initializer , der2Initializer };

        der3Initializer = Der3Initializer(initializers);
    }

    Der1Initializer der1Initializer;
    Der2Initializer der2Initializer;
    Der3Initializer der3Initializer;
}

public class DerivedClass1 : BaseClass {
    public SomeFunction {
        der1Initializer.init();
    }
}

public class DerivedClass2 : BaseClass {
    public SomeFunction {
        der2Initializer.init();
    }
}

public class DerivedClass3 : BaseClass {
    ...
}

Так что:

public class Der3Initializer {
    public GroupInitializationFunction {
        initializers[0].init();    //der1Initializer
        initializers[1].init();    //der2Initializer
    }
}

Вместо:

public class BaseClass {
    public BaseClass() {
        ...
}

public class DerivedClass1 : BaseClass {
    public DerivedClass1 {
        der1Initializer = Der1Initializer(new Factory1());
    }

    public SomeFunction {
        der1Initializer.init();
    }
    Der1Initializer der1Initializer;
}

public class DerivedClass2 : BaseClass {
    public DerivedClass2 {
        der2Initializer = Der2Initializer(new Factory2());
    }

    public SomeFunction {
        der2Initializer.init();
    }
    Der2Initializer der2Initializer;
}

public class DerivedClass3 : BaseClass {
    public DerivedClass3 {
        List initializers = new List()
        {    
            Der1Initializer(new Factory1()), 
            Der2Initializer(new Factory2());
        };

        der3Initializer = Der3Initializer(initializers);
    }
    ...
    Der3Initializer der3Initializer;
}
...
public class Der3Initializer {
    public GroupInitializationFunction {
        initializers[0].init();    //der1Initializer
        initializers[1].init();    //der2Initializer
    }
}

Это огромное упрощение "проблемы".Цель этого кода - уменьшить количество дублирующегося кода и необходимость повторной инициализации членов, которые могут быть использованы совместно, и оптимизировать производительность.

Я знаю, что не всегда хорошая идея предоставлять другим классам доступ к членамони не используют.

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

1 Ответ

2 голосов
/ 11 апреля 2019

Я бы не рекомендовал бы инициализировать дочерние элементы в родительском классе как

  • Нарушения Открытый закрытый принцип , поскольку базовый класс отвечает за инициализацию своих дочерних элементов, и всегда будет необходимо добавлять новые дочерние классы и, следовательно, изменять базовый класс.

  • Нарушает Принцип единой ответственности , поскольку это не роль для базового класса (для инициализации его потомков)

  • Нарушения Инверсия управления , поскольку базовый класс тесно связан с дочерним классом, см. Эту ссылку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...