What about just "adapter" interface/abstract instead of "interface".
I used Phalcon\Mail\Transport abstract class for mail component, which "PHP" transport adapter extends it, and I check it strictly if transport class is instance of Phalcon\Mail\Transport class (else it throws an exception). And transport adapters should have protected abstract "send" method (just defined it as abstract in phalcon.h and implement dummy/empty send method). So I don't have to check if it has "send" method or not (phalcon_method_exists), just fire adapter's "send" method.
So
Phalcon\Logger\Adapter (dummy adapter class - log/begin/commit/rollback/etc methods must be implemented)
Phalcon\Logger\Adapter\File extends from Phalcon\Logger\Adapter
Phalcon\Translate\Adapter (dummy adapter class - query/exists/etc methods must be implemented)
Phalcon\Translate\Adapter\NativeArray extends from Phalcon\Translate\Adapter
Phalcon\Mail\Transport (dummy adapter class - send method must be implemented)
Phalcon\Mail\Transport\PHP extends from Phalcon\Mail\Transport
Same for session, cache backends, etc.