// 类的定义
class Animal{
id:string; // 默认访问修饰符为 public : 类本身、子类、类外部可访问
public name:string; // public : 类本身、子类、类外部可访问
protected type:string = '动物'; // 保护成员 protected, 类本身、子类可访问, 类外部不可访问
private color:string; // 私有成员 private: 类本身访问, 子类、类外部不可访问
// 构造函数
constructor(id:string, name:string,color:string){
this .id = id;
this .name = name;
this .color = color;
}
// 实例方法
run(){
console.log(`${ this .name}(编号为:${ this .id})在跑步`);
}
}
// 类的继承:继承关键字 extends
class Dog extends Animal{
constructor(id:string, name:string, color: '白色' ){
super(id, name,color); // 调用父类的构造函数
}
getDogInfo(){
this .type = '小狗' ;
// console.log(`品种:${this.type}; 名字:${this.name}; 颜色:${this.color}`); // this.color 报错,原因是color在父类中是私有成员,只能在父类中访问,所以报错
console.log(`品种:${ this .type}; 名字:${ this .name}; `);
}
}
let xioahong = new Dog('0001', '小白', '白色' );
xioahong.run(); // 输出 小白(编号为:0001)在跑步
xioahong.getDogInfo(); // 输出 品种:小狗; 名字:小白;
// 类修饰符
// public : 公共属性,本类、子类、类外部均可访问
// protected: 保护成员,本类、子类中可访问,类外部不可访问
// private: 私有成员, 本类中可以访问,子类、类外部不可访问
// 类中的静态属性、静态方法
class Cat {
name:string = '小花猫' ;
static tizhong:number = 12 ;
static eat(){
console.log(`${ this .name}的体重为${Cat.tizhong}斤`);
}
}
Cat.tizhong = 49; // 调用静态属性
Cat.eat(); // 调用静态方法, 输出: Cat的体重为49斤
/* *
* 解析:
* 这里本来预期的输出应该是: 小花猫的体重为49斤, 但是 最终静态方法中无法获取到name属性的值
* 静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存
* 非静态方法是属于对象的,对象是在类加载之后创建的
* 静态方法先于对象存在,所以如果静态方法调用非静态方法的话,可能会报空指针异常。
* 因此: 静态方法不能直接访问非静态属性,但是可以直接访问静态属性,访问方法为: [类名].[属性]
* * */
// 抽象类:
/* *
* 抽象的关键字: abstract
* 抽象类是为其他类提供继承的基类,是给其他类定义的标准。
* 抽象类不能直接被实例化
* 抽象类必须包含至少一个抽象方法
* 抽象方法的声明不包含具体的实现
*/
abstract class Person {
abstract run(): void ;
abstract getInfo():string;
}
// let p = new Person(); // 报错, 抽象类不能直接被实例化
/* *
* 继承抽象类:
* 在这里 Gril 为派生类, Person 为基类
* 派生类必须实现基类中的抽象方法
*/
class Gril extends Person{
name:string;
constructor(name:string){
super();
this .name = name;
}
// 这里实现了Person类中的抽象方法 run()
run(){
console.log(`${ this .name}在跑步`)
}
// 这里实现了Person类中的抽象方法 getInfo()
getInfo(): string {
return this .name;
}
}
let xiaohong = new Gril('小红' );
xiaohong.run(); // 输出:小红在跑步
console.log(xiaohong.getInfo()); // 输出 小红
// 多态
// 万物皆对象,任何对象都会有不同的形态,这叫多态,比如 树叶是一个对象,但是树叶有不同的形状,这就是多态,又比如,都是动物,但是动物又分很多种,这就是多态
// 在代码中,多态其实就是继承,提供一个基类给多个对象继承
/* *
* 声明一个基类, 植物
*/
class Botany {
name:string;
constructor(name:string){
this .name = name;
}
GrowUp(){
console.log(`我是${ this .name},我正在茁壮成长`);
}
}
/* *
* 仙人掌是一种植物,继承 植物 这个对象
*/
class Cactus extends Botany{
thorn:string = '尖尖' ;
constructor(name:string){
super(name)
}
growsThorns(): void {
console.log(`我是一颗${ this .name},我身上会长很多${ this .thorn}的刺`);
}
}
/* *
* 百合花是一种植物,继承 植物 这个对象
*/
class Lily extends Botany{
leaf:string = '绿色' ;
constructor(name:string){
super(name)
}
growsLeaf(): void {
console.log(`我是一颗${ this .name},我身上会长很多${ this .leaf}的叶子`);
}
}
// 实例化一个仙人掌对象
let cactus = new Cactus('仙人掌' );
cactus.GrowUp(); // 输出: 我是仙人掌,我正在茁壮成长
cactus.growsThorns(); // 输出: 我是一颗仙人掌,我身上会长很多尖尖的刺
// 实例化一个玫瑰花的对象
let lily = new Lily('百合花' );
lily.GrowUp(); // 输出: 我是百合花,我正在茁壮成长
lily.growsLeaf(); // 输出: 我是一颗百合花,我身上会长很多绿色的叶子
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did223462