Достаточно часто предоставлять оба, так что в итоге вы получите:
public interface Sendable {
public void sendMe();
}
и
public abstract class AbstractSender implements Sendable {
public abstract void send();
public void sendMe() {
send(this.toString());
}
}
Таким образом, любой, кто доволен реализацией по умолчанию в абстрактном классе, может быстро создать ее подкласс, не переписывая много кода, но любой, кому нужно сделать что-то более сложное (или кому нужно наследовать от другого базового класса) все еще может реализовать интерфейс и быть подключи и играй.