继承
class Student extends Person {
classNumber: string;
constructer(id:number, name: string, classNumber: string) {
super(id,name);
this.classNumber = classNumber;
}
introduce(): string {
return super.introduce() + `, and I am a student`;
}
}
let student = new Student(1, 'xiaoming','三年二班');
console.log(student.introduce());
注意:
类的继承需要使用关键字extends
子类构造器中需使用super()调用父类构造器对继承自父类的属性进行初始化。
在子类可以使用this关键字访问继承自父类的属性和方法
在子类中可以使用super关键字访问父类定义的方法
class Person {
private id: number;
protected name: string;
public age: number;
constructor(id: number, name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
}
class Student extends Person {
}
说明:
private 修饰的属性或方法是私有的,只能在声明它的类中被访问
protected修饰的属性或方法是受保护的,只能在声明它的类和其子类中被访问。
public修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是public的
接口(interface)
接口(interface)是面向对象编程中的另一个重要概念。接口通常会作为一种契约或规范让类(class)去遵守,确保类实现某些特定的行为或功能。
interface Person {
id: number;
name: string;
age: number;
introduce(): void;
}
接口实现
class Student implements Person {
id: number;
name: string;
age: number;
constructor(id: number,name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
introduce(): void {
console.log('Hello,I am a student');
}
}
class Teacher implements Person {
id: number;
name: string;
age: number;
constructor(id: number,name: string, age: number) {
this.id = id;
this.name = name;
this.age = age;
}
introduce(): void {
console.log('Hello,I am a Teacher');
}
}
然后分别创建一个Student对象和⼀个 Teacher 对象,注意两个对象的类型均可以设置Person ,如下:
let p1: Person = new Student(1, 'zhangsan', 17);
let p2: Person = new Teacher(2, 'list', 35)
p1.introduce(); //Hello, I am a student
p2.introduce(); //Hello, I am a teacher
接口的作用(重点!!!)
class Order {
totalAmount: number;
constructor(totalAmount: number) {
this.totalAmount = totalAmount;
}
pay() {
console.log(`AliPay: ${this.totalAmount}`);
}
}
interface PaymentStrategy {
pay(amount: number): void;
}
class Order {
totalAmount: number;
paymentStrategy: PaymentStrategy;
constructor(totalAmount: number,paymentStrategy: PaymentStrategy) {
this.totalAmount = totalAmount;
this.paymentStrategy = paymentStrategy;
}
pay() {
this.paymentStrategy.pay(this.totalAmount);
}
}
这样改造完之后,就可以很容易的在不改变现有代码的情况下,支持新的支付方式了。
class AliPay implements PaymentStrategy {
pay(amount: number): void {
console.log(`AliPay:${amount}`);
}
}
let order = new Order(1000,new AliPay());
order.pay();
稍等
就上面的代码我要讲一下。
this.paymentStrategy.pay(this.totalAmount) 是什么意思?
它就是利用当前订单对象所持有的支付策略对象来处理支付操作。使用策略模式的好处在于,可以将支付逻辑与订单对象的其他功能分离开来。
TS中的接口的特殊性
TypeScript中的接口是一个⾮常灵活的概念,除了⽤作类的规范之外,也常⽤于直接描述对象的类型,例如,现有⼀个变量的定义如下:
let person: {name:string, age:number, gender:string} = {name:'张三', age:10, gender:'男'};
interface Person {
name: sting;
age: number;
gender: string;
}
let person: Person = {name:'张三', age:10, gender:'男'};