目录
摘要
今天主要学习了Ts中有关类的一些知识。主要是Ts中的类,抽象类,继承和多态。
1、Ts中类的写法
Ts中创建一个类语法上和es6还有Java是差不多的,话不多说,直接上代码。
//创建类
class Person{
name:String;
public age:number;
// protected age:number;//console.log(p.age);报错
// private age:number;//子类报错
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
run():string{
return `${this.name}年龄${this.age}在运动`;
}
}
//实例化对象
const p = new Person("张三",20);
写法上Ts是使用class关键词来定义一个类。constructor是构造函数,具体作用就是在实例化的时候把参数赋值给类中的变量。类的方法的定义更像是Java,不用再加function关键词。
需要注意的是:如果类中的属性不在构造函数中初始化的话,要先用“ | ”运算符来对它赋值一个undefined。具体写法name:string | undefined;
Ts的类还有三种修饰符:public(共有,默认这个)\private(私有)\protected(保护)---(基本同Java)
// public公有属性:在类、子类和类外都可以访问
// private私有属性:只能在本类访问
// protected保护属性:只能在本类和子类中访问
2、类的继承
class Person{
name:String;
public age:number;
// protected age:number;//console.log(p.age);报错
// private age:number;//子类报错
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
run():string{
return `${this.name}年龄${this.age}在运动`;
}
}
//继承
class web extends Person{
constructor(name:string,age:number){
super(name,age);//相当于调用父类的构造函数
}
run():string{//子类和父类有同名方法时,优先使用子类的方法;同Java的重写。
return `${this.name}年龄${this.age}在运动---子类`;
}
work():void{
console.log(this.name+"在工作");
}
}
const w = new web("李四",21);
Ts中的类的继承是使用extends 关键词,这一点和es6还有Java是相同的。
其中要注意的是:super()这个函数,相当于调用父类的构造函数。
3、抽象类
抽象类就相当是在类里面定义一个规范,这个规范要求我们强制去实现。
//抽象类和抽象方法(类似Java)
// 抽象方法只能放在抽象类里;抽象类不能实例化
abstract class Animal1{
name:string;
constructor(name:string){
this.name = name;
}
// 抽象方法不能实现,只能定义
abstract eat():any;
}
class Dog1 extends Animal1{
constructor(name:string){
super(name);
}
// 继承抽象类的类必须实现抽象方法,否则报错。
eat():void{
console.log(this.name+"吃骨头")
}
}
1、抽象类使用abstract关键词来定义。
2、抽象方法必须定义在抽象类里面,但抽象类里不一定必须要有抽象方法。
3、抽象类不能被实例化。
4、继承抽象类的子类必须实现抽象方法。
4、多态
class Animal{
name:string;
constructor(name:string){
this.name = name;
}
eat():void{
console.log("不同动物吃的不同");
}
}
//狗狗
class Dog extends Animal{
constructor(name:string){
super(name);
}
eat():void{
console.log(this.name+"吃骨头")
}
}
//小猫
class Cat extends Animal{
constructor(name:string){
super(name);
}
eat():void{
console.log(this.name+"吃鱼")
}
}
1、多态主要就是继承+重写父类方法
2、多态主要用于子类有相同的表现,但是表现形式不同(例如:动物都要吃,但吃的东西不同)
5、补充静态方法
//静态方法和静态属性,使用static关键字(基本同Java);
class Person1{
name:string;
static age = 21;
constructor(name:string){
this.name = name;
}
static run():void{
console.log("静态方法");
console.log(this.name);//打印的为Person1,说明获取不到类中的属性
console.log(this.age);//打印的为21,说明可以获取到静态属性
}
work():void{
console.log(this.name+"work");
}
}
const p1 = new Person1("张三");
// p1.run();//报错,说明静态方法不能通过实例调用
Person1.run();
p1.work();
class web1 extends Person1{
constructor(name:string){
super(name);
}
}
const w1 = new web1("李四");
// w1.run();//报错
1、静态方法和静态属性,使用static关键字(基本同Java);
2、静态方法获取不到类中的属性
3、静态方法可以获取到静态属性
4、静态方法不能通过实例调用只能通过“类名.静态方法名”来使用