Это потому, что они должны быть реализованы по-разному в зависимости от используемого драйвера?
Например. Обычно рекомендуется кодировать интерфейс вместо реализации (в данном контексте = класс) по нескольким причинам. Один из них был упомянут вами: связанные, но разные реализации могут иметь общий интерфейс. Другой момент заключается в том, что одна конкретная реализация может быть изменена негласно, не требуя также изменения интерфейса: скажем, в следующей реализации драйвера должен использоваться другой класс. Для этого достаточно реализовать существующий интерфейс.
Теперь представьте, что вместо интерфейсов код работал с типами классов. Теперь, если реализация изменилась, эти интерфейсы также должны быть изменены. Это будет означать, что каждый пользователь (включая вас) API должен был также изменить свой код!