Gibt es eine elegante kanonische Methode zum Implementieren eines Vorlagenmethodenmusters in Go? In C++ sieht das dies wie:Elegante Methode zum Implementieren eines Vorlagenmethodenmusters in 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")
}
Aber dieser Code nicht mit Laufzeit Null-Pointer-Fehler:
#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;
}
In golang ich so etwas wie dies schrieb. Grundidee ist es, einige Funktionen von abgeleiteten Klassen (go structs) mit der Basisklassenroutine so zu mischen, dass der Basisklassenstatus aus dieser abgeleiteten Routine verfügbar ist.
Ja, jetzt funktioniert es. Aber es sieht immer noch irgendwie hässlich aus ... Danke, jedenfalls – user6256186