TypeScript16:抽象类

一、为什么需要抽象类

有时,某个类只表示一个抽象概念,主要用于提取子类共有的成员,而不能直接创建它的对象。该类可以作为抽象类。

给类前面加上 abstract ,表示该类是一个抽象类,不可以创建一个抽象类。

 

二、抽象成员 

父类中,可能知道有些成员是必须存在的,但是不知道该成员的值或实现是什么,因此,需要有一种强约束,让继承该类的子类,必须要实现该成员。 

抽象类中,可以有抽象成员,这些抽象成员必须在子类中实现。

abstract class Chess { 
  x: number = 0;
  y: number = 0;

  abstract readonly name: string;
}
class Horse extends Chess {
  readonly name: string = "马"; 
}
class Pao extends Chess { 
  readonly name: string;
  constructor() {
    super();
    this.name = "炮";
  }
}
class Soldier extends Chess { 
  get name() { 
    return "兵";
  }
}
const h = new Horse()
const p = new Pao()
const s = new Soldier()
console.log(h.name, p.name, s.name); // 马 炮 兵
abstract class Chess { 
  x: number = 0;
  y: number = 0;
  abstract readonly name: string;
  abstract move(targetX: number, targetY: number): boolean;
}
class Horse extends Chess {
  readonly name: string = "马"; 
  move(targetX: number, targetY: number): boolean {
    this.x = targetX;
    this.y = targetY;
    console.log("马移动成功")
    return true;
  }
}
class Pao extends Chess {
  move(targetX: number, targetY: number): boolean {
    this.x = targetX;
    this.y = targetY;
    console.log("炮移动成功")
    return true;
  } 
  readonly name: string;
  constructor() {
    super();
    this.name = "炮";
  }
}
class Soldier extends Chess { 
  get name() { 
    return "兵";
  }
  move(targetX: number, targetY: number): boolean {
    this.x = targetX;
    this.y = targetY;
    console.log("兵移动成功")
    return true;
  } 
}
const h = new Horse()
const p = new Pao()
const s = new Soldier()
h.move(3, 5) // 马移动成功
p.move(2, 3) // 炮移动成功
s.move(1, 2) // 兵移动成功

三、设计模式

设计模式:面对一些常见的功能场景,有一些固定的、经过多年实践的成熟方法,这些方法称之为设计模式。 

模板模式:有些方法,所有的子类实现的流程完全一致,只是流程中的某个步骤的具体实现不一致,可以将该方法提取到父类,在父类中完成整个流程的实现,遇到实现不一致的方法时,将该方法做成抽象方法。

abstract class Chess { 
  x: number = 0;
  y: number = 0;
  abstract readonly name: string;
  move(targetX: number, targetY: number): boolean { 
    console.log("1.边界判断");
    console.log("2.目标位置是否已有己方棋子");
    // 3.棋子移动规则判断
    if (this.rule(targetX, targetY)) { 
      this.x = targetX;
      this.y = targetY;
      console.log(`${this.name}移动成功`);
      return true;
    }
    console.log(`${this.name}移动失败`);
    return false
  }
  protected abstract rule(targetX: number, targetY: number):boolean
}
class Horse extends Chess {
  readonly name: string = "马"; 
  protected rule(targetX: number, targetY: number): boolean { 
    return true;
  }
}
class Pao extends Chess {
  readonly name: string;
  protected rule(targetX: number, targetY: number): boolean { 
    return false;
  }
  constructor() {
    super();
    this.name = "炮";
  }
}
class Soldier extends Chess { 
  protected rule(targetX: number, targetY: number): boolean { 
    return true;
  }
  get name() { 
    return "兵";
  }
}
const h = new Horse()
const p = new Pao()
const s = new Soldier()
h.move(3, 5)
p.move(2, 3)
s.move(1, 2)
// 输出
// 1.边界判断
// 2.目标位置是否已有己方棋子
// 马移动成功
// 1.边界判断
// 2.目标位置是否已有己方棋子
// 炮移动失败
// 1.边界判断
// 2.目标位置是否已有己方棋子
// 兵移动成功
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猛扇赵四那半好嘴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值