假设FrameworkA使用一个FrameworkA.StandardLogger类进行日志记录。我想用另一个日志库( SuperLogger类)替换日志库。
为了实现这一点,有接口:FrameworkA将提供其他库必须实现的FrameworkA.Logger接口。
但是,如果其他库没有实现这个接口呢?FrameworkA可能是一个不受欢迎的框架,不足以使SuperLogger关心它的接口。
可能的解决办法是:
如果没有标准化的接口,如果类是兼容的,您希望避免编写无用的适配器所带来的痛苦怎么办?
在运行时,不能有另一个解决方案来确保类符合约定吗?
想象一下(伪代码中非常简单的实现):
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:我知道当没有类型检查时,即使它没有实现接口,也可以使用任何您想要的对象,但是我会对一些实际检查对象是否符合接口的东西感兴趣。
发布于 2013-02-20 11:02:16
这被称为鸭子输入,这是一个在Ruby中可以找到的概念(“它像鸭子一样走路,像鸭子一样嘎嘎叫,它一定是鸭子”)
在其他动态类型语言中,您可以模拟它,例如在PHPwithmethod_exists中。在静态类型化语言中,可能存在与反射相结合的解决方法,搜索“鸭子类型+语言”将有助于找到它们。
发布于 2013-02-20 11:30:06
这更像是静态类型的问题,而不是OOP问题。Java和Ruby都是面向对象语言,但是Java不允许您想要的东西(静态类型化),但是Ruby允许(作为它的动态类型)。
从静态类型语言的角度来看,一个主要的(如果不是主要的)优势是在编译时知道一个赋值是否安全有效。您要寻找的是动态类型化语言(如Ruby),但是在静态类型化语言中是不可能的--这是通过设计(编译时安全性)实现的。
您可以(但它很难看)做(在Java中)这样的事情:
Object objLogger = new SupperLogger();
Logger logger = (Logger)objLogger;这将在编译时传递,但如果赋值无效,则在运行时失败。
尽管如此,上面的内容很难看,我也不会这么做--在运行时,它不会给您带来太多的风险,也不会带来不愉快的(甚至可能是令人感到意外的)异常。
我想,在Java这样的语言中,您所希望的最好的方法是将创建抽象到您想要使用的地方:
Logger logger = getLogger();与getLogger的内部结构一起决定返回什么。然而,这只是将实际的创建推迟到更低的位置--您仍然必须以静态类型的安全方式这样做。
https://stackoverflow.com/questions/14977102
复制相似问题