image.png

payable.ts

export interface Payable {
  processPayment(amount: number): boolean;
  getPaymentFee(amount: number): number;
}

payment-method.ts

export class PaymentMethod {
   protected accountName: string;

  constructor(accountName: string) {
    this.accountName = accountName;
  }

  getAccountName(): string {
    return this.accountName;
  }
}

ewallet.ts

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;
  }
}

credit-card.ts

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;
  }
}

index.ts

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

README.md

# TypeScript Quiz — ข้อ 5 (1 คะแนน)

## 🎯 คำสั่ง

ให้นักเรียนสร้าง **Interface และ Class** ตาม **UML Class Diagram** ที่กำหนดให้
โดยต้องทำให้ไฟล์ `index.ts` ที่กำหนดให้ สามารถทำงานได้ถูกต้อง และได้ผลลัพธ์ตามที่คาดหวัง

## 📊 UML Class Diagram

![UML Class Diagram](./image.png)

> ⚠️ **สำคัญ**: ต้องอ่านและทำความเข้าใจ 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 ← ไฟล์ที่กำหนดให้