
export interface Payable {
processPayment(amount: number): boolean;
getPaymentFee(amount: number): number;
}
export class PaymentMethod {
protected accountName: string;
constructor(accountName: string) {
this.accountName = accountName;
}
getAccountName(): string {
return this.accountName;
}
}
import { Payable } from "./payable";
import { PaymentMethod } from "./payment-method";
export class EWallet extends PaymentMethod implements Payable {
private walletId: string;
constructor(accountName: string, walletId: string) {
super(accountName);
this.walletId = walletId;
}
public getAccountName(): string {
return this.accountName;
}
public processPayment(amount: number): boolean {
console.log(`Cutting e-wallet balance: ${amount} Baht`);
return true;
}
public getPaymentFee(amount: number): number {
return amount * 0.01;
}
}
import { Payable } from "./payable";
import { PaymentMethod } from "./payment-method";
export class CreditCard extends PaymentMethod implements Payable {
private cardNumber: string;
constructor(accountName: string, cardNumber: string) {
super(accountName);
this.cardNumber = cardNumber;
}
public processPayment(amount: number): boolean {
console.log(`Cutting credit card balance: ${amount} Baht`);
return true;
}
public getPaymentFee(amount: number): number {
return amount * 0.02;
}
}
import { PaymentMethod } from "./payment-method";
import { CreditCard } from "./credit-card";
import { EWallet } from "./ewallet";
// ============================================
// ทดสอบ Polymorphism: PaymentMethod
// ============================================
console.log("=== Testing Polymorphism: PaymentMethod ===");
const payments: PaymentMethod[] = [
new CreditCard("John Doe", "1234-5678-9012-3456"),
new EWallet("Jane Doe", "081-234-5678"),
];
const amount = 1000;
payments.forEach((payment, index) => {
console.log(`\\nPayment ${index + 1} (${payment.constructor.name}):`);
console.log(`Account: ${payment.getAccountName()}`);
// Process Payment
const success = payment.processPayment(amount);
console.log(`Payment Status: ${success ? "Success" : "Failed"}`);
// Calculate Fee
const fee = payment.getPaymentFee(amount);
console.log(`Fee: ${fee}`);
});
// Expected Output:
//
// Payment 1 (CreditCard):
// Account: John Doe
// Payment Status: Success
// Fee: 20
//
// Payment 2 (EWallet):
// Account: Jane Doe
// Payment Status: Success
// Fee: 10
# TypeScript Quiz — ข้อ 5 (1 คะแนน)
## 🎯 คำสั่ง
ให้นักเรียนสร้าง **Interface และ Class** ตาม **UML Class Diagram** ที่กำหนดให้
โดยต้องทำให้ไฟล์ `index.ts` ที่กำหนดให้ สามารถทำงานได้ถูกต้อง และได้ผลลัพธ์ตามที่คาดหวัง
## 📊 UML Class Diagram

> ⚠️ **สำคัญ**: ต้องอ่านและทำความเข้าใจ UML Class Diagram ให้ครบถ้วน
### รายละเอียด
1. **Interface `Payable`**:
- `processPayment(amount: number)`: boolean
- `getPaymentFee(amount: number)`: number
2. **Class `PaymentMethod`**:
- `accountName`: string (protected)
- Constructor: รับ `accountName`
- `getAccountName()`: string
- ต้องสร้าง method หรือ logic ตามความเหมาะสม
3. **Class `CreditCard`**:
- `cardNumber`: string (private)
- Constructor: รับ `accountName`, `cardNumber`
- `processPayment(amount: number)`: boolean
- จำลองการตัดบัตร (ในที่นี้ให้ return true เสมอ)
- **ต้องมีการ console.log ว่า Cutting credit card balance: {amount} Baht (amount คือจำนวนเงินที่ตัด)**
- `getPaymentFee(amount: number)`: number
- ค่าธรรมเนียม 2% ของยอดเงิน
4. **Class `EWallet`**:
- `walletId`: string (private)
- Constructor: รับ `accountName`, `walletId`
- `processPayment(amount: number)`: boolean
- จำลองการตัดเงิน (ในที่นี้ให้ return true เสมอ)
- **ต้องมีการ console.log ว่า Cutting e-wallet balance: {amount} Baht (amount คือจำนวนเงินที่ตัด)**
- `getPaymentFee(amount: number)`: number
- ค่าธรรมเนียม 1% ของยอดเงิน
## 📌 หมายเหตุสำคัญ
**ในไฟล์ `index.ts` มี comment (`//`) ที่แสดงตัวอย่างผลลัพธ์ที่คาดหวัง**
## 📝 หมายเหตุ
- ห้ามแก้ไขไฟล์ `index.ts`
📁 โครงสร้างไฟล์ที่ต้องมี p05/ ├── payable.ts ← Interface ├── payment-method.ts ← Abstract Class ├── credit-card.ts ← Class ├── ewallet.ts ← Class ├── index.ts ← ไฟล์ที่กำหนดให้