【发布时间】:2019-08-01 18:50:19
【问题描述】:
这是下一个 JavaScript 类结构:
// data.service.ts
export class DataService {
public url = environment.url;
constructor(
private uri: string,
private httpClient: HttpClient,
) { }
getAll() {}
getOne(id: number) {}
create(data: any) {}
// etc...
}
接下来是可以使用DataService的方法与服务器通信的通用数据模型:
// Model.model.ts
import './data.service';
export class Model extends DataService {
all() {}
get() {
// parse and make some basic validation on the
// DataService.getOne() JSON result
}
// etc...
}
最后我基于 Model.model.ts 创建了一个特定的数据模型:
// User.model.ts
import './Model.model.ts';
export class User extends Model {
id: number;
name: string;
email: string;
init() {
// make specific validation on Model.get() result
}
}
如果我在我的代码中使用 User 类,我可以根据需要直接调用 DataService 的 getAll() 函数。但这不是一件好事,因为在这种情况下我错过了内置验证。
如何阻止类的方法继承?
我正在寻找类似 PHP 的 static 方法的东西。子类可以使用方法,但他的子类不能。
我想要这样的东西:
const dataService = new DataService();
dataService.getAll(); // void
const model = new Model();
model.getAll(); // undefined
model.all(); // void
const user = new User();
user.getAll(); // undefined
user.all(); // void
有什么办法吗?
【问题讨论】:
-
我猜你需要
private和protected。 -
从概念上讲,模型不是 DataService 并对其进行建模对我来说似乎是完全错误的。也许一个可能需要另一个,但它们不应该是同一件事。
-
不是,但是Model可以有get()方法,可以从服务器获取数据,然后自己初始化。在这种情况下,我可以使用
user.get(1)来获取数据,并将它们初始化到用户模型中。当然,user.get() 方法期望来自 API 的 JSON 看起来像一个用户模型,但可能包含0、null或''值。 user.init() 可以处理这些,最后我得到一个有效的用户模型。当然,我为客户、产品、文档、案例文件等使用了许多模型……每个模型都需要一个 .get() 方法和一个特定的 .init() 方法才能有用。
标签: javascript typescript class inheritance multiple-inheritance