Скажите, FrameworkA
использует класс FrameworkA.StandardLogger
для ведения журнала. Я хочу заменить библиотеку журналов на другую (класс SuperLogger
).Проверьте, реализует ли класс интерфейс во время выполнения
Чтобы сделать это возможным, есть интерфейсы: FrameworkA
обеспечит интерфейс FrameworkA.Logger
, что другие библиотеки должны реализовать.
Но что делать, если другие библиотеки не реализуют этот интерфейс? FrameworkA
может быть недостаточно популярным, чтобы сделать SuperLogger
заботиться о его интерфейсе.
Возможные решения:
- имеют стандартизованный интерфейс (определяется стандартами, как JSR, PSR, ...)
- адаптеры записи
Что делать, если не существует стандартного интерфейса, и вы хотите избежать боли при написании бесполезных адаптеров, если классы совместимы?
Не может быть еще одно решение, обеспечивающее соответствие класса требованиям контракта, но во время выполнения?
Представьте себе (очень простую реализацию в псевдо-код):
namespace FrameworkA;
interface Logger {
void log(message);
}
namespace SuperLoggingLibrary;
class SupperLogger {
void log(message) {
// ...
}
}
SupperLogger
совместим с Logger
, если только он реализован интерфейс Logger. Но вместо того, чтобы иметь «жесткую зависимость» в FrameworkA.Logger
, его публичный «интерфейс» (или подпись) может быть проверена во время выполнения:
// Something verify that SupperLogger implements Logger at run-time
Logger logger = new SupperLogger();
// setLogger() expect Logger, all works
myFrameworkAConfiguration.setLogger(logger);
В поддельном сценарии я ожидаю, что Logger logger = new SupperLogger()
сбоя во время выполнения если класс не совместим с интерфейсом, но для успеха, если он есть.
ли это быть действительным вещь в ООП? Если да, то существует ли он на любом языке? Если нет, то почему это недействительно?
Мой вопрос означает статически типизированные языки (Java, ...) или динамически типизированные языки (PHP, ...).
Для PHP & al: Я знаю, что когда нет проверки типа, вы можете использовать любой объект, который вам нужен, даже если он не реализует интерфейс, но меня бы интересовало то, что действительно проверяет, что объект соответствует с интерфейсом.
Я также ищу языки с подобным типом системы, но я полагаю, что вы имеете в виду время компиляции, а не время выполнения, поскольку на время выполнения вы можете почти на любом языке написать код, который будет проверять методы «Доступность и подписи и исключение, если они не совпадают. – user