我正在研究一个基类,它将检查一组常用方法,并对每个方法执行某些操作:
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);
}
}
仍然不是很好:
什么是更好的设计?
答案 0 :(得分:0)
在设计一些被称为“为扩展设计”的类层次结构时,有一种常见的模式。出于这个原因,我们通常创建一些空的(占位符)方法,这些方法将被客户端覆盖并在我们的生命周期内的某个地方执行。请考虑以下事项:
class BaseClass {
constructor() {
_register(this.getExtraRoutes());
}
_register(routes) {
...
}
getExtraRoutes() {
return [];
}
}
class MyClass extends BaseClass {
getExtraRoutes() {
return { ... }
}
}
这是你要找的东西吗?