我正在开发一个基类,它将检查一组常用方法,并在每个方法存在时对其执行一些操作:
class BaseClass {
get router() {
if (!this._router) {
this._register();
}
return this._router;
}
_register() {
this._router = new Router()
if (this.list) {
this._router.use('/', this.list);
}
if (this.detail) {
this._router.use('/:id', this.detail);
}
// etc...
}
}
我想允许该类的用户也“注册”他们自己的自定义方法。
作为第一遍,我想让它们覆盖 _register
:
class MyClass extends BaseClass {
list() {...}
_register() {
super._register();
this._router.use('/custom/route', this.customMethod);
}
}
嗯...这不太好,因为他们必须添加 super
样板并了解 _router
。
我的下一个最佳方案是添加一个方法来在基类中注册额外内容:
addExtraRoute(route, method) {
this._extras[route] = method
}
然后在 _register 方法中循环它,将它们全部添加。 这稍微好一些,因为用户可以在构造函数中“注册”他们的方法:
class MyClass extends BaseClass {
constructor() {
super();
this.addExtraRoute('/custom/route', this.customMethod);
}
}
仍然不太好:
- 定义方法和注册之间没有局部性,这有点难以阅读
- 仍然是 super 样板,需要确保我们知道要传递给基类的任何参数。
什么是更好的设计?
最佳答案
设计某些类层次结构时有一个常见的模式,称为“扩展设计”。因此,通常我们会创建一些空(占位符)方法,这些方法将由客户端覆盖,并在生命周期内的某个位置执行这些方法。考虑以下因素:
class BaseClass {
constructor() {
_register(this.getExtraRoutes());
}
_register(routes) {
...
}
getExtraRoutes() {
return [];
}
}
class MyClass extends BaseClass {
getExtraRoutes() {
return { ... }
}
}
这是您正在寻找的东西吗?
关于javascript - 通过自动发现功能向基类“注册”额外方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48829521/