說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