泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。
code
和message
;抽取接口公共属性:code,message,result
class BaseResponse {
code: number;
message: string;
result: any;
constructor(code = 200, message: string, result: any) {
this.code = code;
this.message = message;
this.result = result;
}
}
模拟数据库表数据的唯一主键id
class BaseData {
id: number;
constructor(id: number) {
this.id = id;
}
}
模拟数据库人员表单条数据
class Person extends BaseData {
name: string;
age: number;
constructor(id: number, name: string, age: number) {
super(id);
this.name = name;
this.age = age;
}
}
模拟数据库人员表多条数据
class ListPersonData {
size: number;
pages: number;
persons: Person[];
constructor(size: number, pages: number, persons: Person[]) {
this.size = size;
this.pages = pages;
this.persons = persons;
}
}
class ListPresonResponse extends BaseResponse {
// 组装数据
static toResponse(): object {
const person = new Person(100, "zhangsan", 18);
const result = new ListPersonData(20, 1, [person]);
const listDataResponse = new ListPresonResponse(
200,
"数据加载完成",
result
);
return listDataResponse;
}
}
class PersonResponse extends BaseResponse {
// 组装数据
static toResponse(): object {
const person = new Person(100, "zhangsan", 18);
const personResponse = new PersonResponse(200, "数据加载完成", person);
return personResponse;
}
}
通过输出我们可以看到需求已经实现了,也可以看得出来类直接的关系比较紧密,不利于扩展和维护。我们看一看应用泛型后有什么变化吧。
class BaseResponse<T> {
code: number;
message: string;
result: T;
constructor(code = 200, message: string, result: T) {
this.code = code;
this.message = message;
this.result = result;
}
}
class ListPresonResponse extends BaseResponse<ListPersonData> {
// 组装数据
static toResponse(): object {
const person = new Person(100, "zhangsan", 18);
const result = new ListPersonData(20, 1, [person]);
const listDataResponse = new ListPresonResponse(
200,
"数据加载完成",
result
);
return listDataResponse;
}
}
class PersonResponse extends BaseResponse<Person> {
// 组装数据
static toResponse(): object {
const person = new Person(100, "zhangsan", 18);
const personResponse = new PersonResponse(200, "数据加载完成", person);
return personResponse;
}
}
切记ListData为公共类不显示的关联其他类,原来的persons属性改为list属性
class ListData<T extends BaseData> {
size: number;
pages: number;
list: T[];
constructor(size: number, pages: number, list: T[]) {
this.size = size;
this.pages = pages;
this.list = list;
}
}
class ListPresonResponse extends BaseResponse<ListData<Person>> {
// 组装数据
static toResponse(): object {
const person = new Person(100, "zhangsan", 18);
const result = new ListData(20, 1, [person]);
const listDataResponse = new ListPresonResponse(
200,
"数据加载完成",
result
);
return listDataResponse;
}
}
应用泛型后的代码变得更容易扩展,我们如果新增一个商品表的话,对应的单条数据返回和多条数据返回的结构将可以很方便的在原来的基类上进行扩展了,如果需要在基类中进行属性的扩展和变更将受影响到所有子类中。 我们来看一下为商品对象报文增加的类:
class Goods extends BaseData {
// 实现内部属性
}
class ListGoodsResponse extends BaseResponse<ListData<Goods>> {
// 实现组装数据函数(模拟使用)
}
class GoodsResponse extends BaseResponse<Goods> {
// 实现组装数据函数(模拟使用)
}
泛型的应用使我们的程序在设计过程中对结构进行抽象但不指明具体类的类型,使的基类变得有规矩的宽松,延时到进行子类的实现时再补充泛型类型进行明确。