Есть ли элегантный канонический способ реализации шаблона шаблона шаблона в Go? В C++ это выглядит следующим образом:Элегантный способ реализации шаблона шаблона метода в Голанге
#include <iostream>
#include <memory>
class Runner {
public:
void Start() {
// some prepare stuff...
Run();
}
private:
virtual void Run() = 0;
};
class Logger : public Runner {
private:
virtual void Run() override {
std::cout << "Running..." << std::endl;
}
};
int main() {
std::unique_ptr<Runner> l = std::make_unique<Logger>();
l->Start();
return 0;
}
В golang я написал что-то вроде этого:
package main
import (
"fmt"
"time"
)
type Runner struct {
doRun func()
needStop bool
}
func (r *Runner) Start() {
go r.doRun()
}
func NewRunner(f func()) *Runner {
return &Runner{f, false}
}
type Logger struct {
*Runner
i int
}
func NewLogger() *Logger {
l := &Logger{}
l.doRun = l.doRunImpl
return l
}
func (l *Logger) doRunImpl() {
time.Sleep(1 * time.Second)
fmt.Println("Running")
}
func main() {
l := NewLogger()
l.Start()
fmt.Println("Hello, playground")
}
Но этот код не с выполнения нулевой ошибки указателя. Основная идея состоит в смешении некоторой функциональности от производных классов (go structs) до подпрограммы базового класса таким образом, что состояние базового класса доступно из этой производной подпрограммы в составе.
Да, теперь это работает. Но все равно выглядит как-то уродливо. Спасибо, в любом случае – user6256186