Исходя из Java Фон, я изучил этот , и он реализует мультитоны, но у меня другой случай, это пользователь моей библиотеки, который передает реализации во время выполнения.
Здесь есть два фрагмента кода: один принадлежит библиотеке (предварительно скомпилирован), а другой является пользователем кода библиотеки. Я могу изменить как библиотеку, так и код пользователя для достижения цели sh.
1. Код библиотеки (предварительно скомпилированный)
interface IPrinter {
fun print()
}
open class Printer: IPrinter {
companion object {
private var printers = mutableMapOf<String, IPrinter>()
@Synchronized
fun getInstance(key: String, lambda: (key: String) -> IPrinter): IPrinter {
if (printers[key] == null) {
printers[key] = lambda(key)
}
return printers[key]!!
}
}
private constructor(key: String) { // can use init too here.
// some initializers
}
override fun print() {
print("default implementation")
}
// ... other methods
}
2. Пользователь кода библиотеки , связанный с файлом jar
// it has to extend PrinterHost to inherit methods, problem -> Printer()
class PrinterImplementation: Printer(), IPrinter {
companion object {
fun getInstance(key: String): IPrinter {
return Printer.getInstance(key) { key -> PrinterImplementation() }
}
}
override fun print() {
println("Print page from printer")
}
}
// Usage: PrinterImplementation.getInstance("myPrinter")
Я думаю, что проблема с (2 пользователя кода библиотеки) состоит в том, что я создаю экземпляр Printer () из базового класса, пытаясь оберните голову вокруг этой реализации, где задействовано наследование.