Классы с тем же именем, что и их родительские классы, беспокоят меня. В Java java.sql.Date расширяет java.util.Date. Это очень раздражает, потому что вы должны указать точный класс, который вы хотите импортировать, или указать полное имя класса (включая пакет / пространство имен).
Лично я предпочитаю называть вещи такими, какие они есть; если класс Base или Abstract существует только для обеспечения частичной реализации чего-либо и не представляет интерфейс для этой вещи, часто допустимо помещать слово Abstract или Base в его имя. Однако, если этот класс также представляет интерфейс, вам следует просто назвать его в честь того, что он делает.
Например, в Java у нас есть интерфейс Connection (для соединений с БД). Это просто называется Connection, а не IConnection. Вы используете это так:
Connection con = getConnectionFromSomewhere();
Если вы создаете драйвер JDBC и вам необходимо реализовать соединение, у вас может быть ConnectionBase или AbstractConnection, который является нижним уровнем деталей реализации вашего конкретного соединения. Вы могли бы иметь
abstract class AbstractConnection implements Connection
class OracleConnection extends AbstractConnection
или что-то в этом роде. Однако клиенты вашего кода никогда не видят AbstractConnection и OracleConnection, они видят только Connection.
Таким образом, в целом, классы, которые должны быть полезными, должны быть названы в честь того, что они представляют / делают, тогда как классы, которые являются помощниками для поддержки / организации кода, могут быть названы в честь того, чем они являются.
* ps Ненавижу называть интерфейсы буквой I. Люди называют все свои классы буквой C? Это 2009! ваша IDE может сказать вам, что это за тип объекта, в нечетном случае, когда даже важно, является ли он интерфейсом или классом.