Если AbstractMethodA не применяется к Child-B, то Child-B не должен наследоваться от Parent-A.
Или взять противозачаточное, если Child-B наследует от Parent-A, и AbstractMethodA не применяется к потомку, то он также не должен быть в родительском.
Помещая метод в Parent-A, вы говорите, что метод применяется к Parent-A и всем его дочерним элементам. Вот что наследование означает , и если вы используете его для обозначения чего-то другого, вы окажетесь в серьезном споре с вашим компилятором.
[Редактировать - это сказало, что ответ Младена Прайдика хорош, если метод действительно применяется, но не должен делать ничего для одного или нескольких участвующих классов. Метод, который ничего не делает, - это IMO, не то же самое, что метод, который не применим, но, может быть, мы не подразумеваем то же самое под словом «не применяется»]
Другой способ - реализовать метод в Child-B в любом случае, но пусть он делает что-то радикальное, например, всегда возвращает ошибку, или генерирует исключение, или что-то еще. Это работает, но его следует рассматривать скорее как пустяк, а не как чистый дизайн, поскольку это означает, что вызывающие абоненты должны знать, что то, что у них есть, они рассматривают как Parent-A, это действительно child-B и, следовательно, они не должны вызывать AbstractMethodA. По сути, вы отказались от полиморфизма, который является основным преимуществом наследования ОО. Лично я предпочитаю делать это таким образом, чем иметь реализацию, генерирующую исключения в базовом классе, потому что тогда дочерний класс не может «случайно» вести себя плохо, вообще «забыв» реализовать метод. Он должен реализовать это, и если он реализует это, чтобы не работать, то это делает это явно. Плохая ситуация должна быть шумной.