abstract class Account {
protected successor: Account | null = null;
protected name = "account";
constructor(protected balance: number) {}
setNext(account: Account): void {
this.successor = account;
}
pay(amount: number): void {
if (this.balance >= amount) {
console.log(`Paid ${amount} using ${this.name}`);
} else if (this.successor) {
console.log(`Cannot pay using ${this.name}. Proceeding...`);
this.successor.pay(amount);
} else {
console.log("None of the accounts have enough balance");
}
}
}
class Bank extends Account {
protected name = "bank";
}
class Paypal extends Account {
protected name = "Paypal";
}
class Bitcoin extends Account {
protected name = "bitcoin";
}