SayFrameworkA
使用一个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()
如果类与接口不兼容,我希望在运行时失败,但如果兼容则成功。
这在 OOP 中是有效的吗?如果是,它是否以任何语言存在?如果不是,为什么它无效?
我的问题代表静态类型语言(Java,...)或动态类型语言(PHP,...)。
对于 PHP & al:我知道当没有类型检查时你可以使用任何你想要的对象,即使它没有实现接口,但我会对实际检查对象是否符合接口的东西感兴趣。