说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
兼容,只要它实现的记录器接口。但是,而不必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()
在运行时失败如果该类与接口不兼容,但如果它是成功的话。
这是在OOP中的一个有效的东西吗?如果是,它是否以任何语言存在?如果不是,为什么它是无效的?
我的问题代表静态类型语言(Java,...)或动态类型语言(PHP,...)。对于PHP & al:我知道什么时候没有类型检查你可以使用任何你想要的对象,即使它没有实现接口,但我会感兴趣的东西,实际上检查对象符合与界面。
我也在寻找这种类型系统的语言,但我想你的意思是编译时,而不是运行时,因为对于运行时你几乎可以为任何语言编写代码来检查方法'可用性和签名,并且如果它们不匹配会引发异常。 – user 2016-02-28 18:55:51