Я бы основывал решение на том, что делают методы, если они делают вещи, специфичные для классов A, B и C, тогда они должны быть в базовом классе.Это помогает поддерживать чистоту кода, скрывая функциональность, связанную с классами, от остальной части системы.(конечно, я предполагаю, что A, B и C либо уже наследуются от D, либо, очевидно, связаны)
Если они делают вещи с другими типами, которые не присущи тому, что A,B и C делают, тогда, чтобы максимизировать возможности для повторного использования, они должны быть в служебном классе.
Если они делают вещи с другими типами, специфичными для этого другого типа (например, симпатичная печать даты и времени)) подумайте о том, чтобы сделать их методами расширения для этого типа.