Поскольку я не вижу других предложений, я выкину некоторые из них и посмотрю, являются ли они тем, что вы ищете.
Во-первых, если ООП находится на столе, наследование может представлятьэтот вид общего поведения.Что бы вы сделали, это инкапсулировали общее, A
-специфичное и B
-специфичное поведение в классах Shared
, ASpecific
и BSpecific
, где ASpecific
и BSpecific
наследуются от Shared
.Затем, если либо A
, либо B
, вы раскручиваете экземпляр либо ASpecific
, либо BSpecific
соответственно, а затем обрабатываете его как экземпляр Shared
.Если у вас есть условия C
, D
и т. Д., Которые не используют совместно используемую вещь, возможно, у вас был бы другой родительский класс с именем Base
, и вы бы CBase
, DBase
наследовали от Base
, Shared
наследуя от Base
, и раскрутите экземпляр в зависимости от условия и обработайте результат как экземпляр Base
.
Во-вторых, вы можете использовать инверсию управления, передаваяА-специфичное и В-специфичное поведение для совместно используемого метода, когда требуется общий контент.Вы можете использовать ООП для этого или чисто функционального программирования.Если перейти ко второму (поскольку первое похоже на приведенное выше решение и, возможно, не так хорошо), у вас будет функция shared
, которая принимает функцию f
в качестве аргумента.Функция f
будет иметь сигнатуру, которая требует передачи общего объекта. Затем, если A
, вызовите shared
с функцией (указатель или анонимный inline), которая выполняет специфические для A
вещи для общего ресурса.объект перешел в него;в противном случае, если B
, вызовите shared
с функцией, которая делает специфичные для B
вещи для общего объекта, переданного в него.
Если все, что вы действительно хотите избежать, это вложение, вы также можетевывести содержимое if (A || B) { … }
и сделать его доступным для общего доступа, который объявлен, но не создан в более широком контексте;затем, позже, проверьте A
и B
отдельно и знайте, что в этих случаях shared
будет иметь требуемую настройку ранее.