public abstract class BankAccount
public string AccountNumber { get; private set; }
public double Balance { get; protected set; }
public string AccountHolder { get; private set; }
public BankAccount(string accountHolder, string accountNumber, double initialBalance)
AccountHolder = accountHolder;
AccountNumber = accountNumber;
Balance = initialBalance >= 0 ? initialBalance : throw new ArgumentException("Initial balance cannot be negative");
public virtual void Deposit(double amount)
Console.WriteLine("Deposit amount must be positive.");
Console.WriteLine($"Deposit: ${amount:F2}");
Console.WriteLine($"New Balance: ${Balance:F2}");
public virtual void Withdraw(double amount)
Console.WriteLine("Withdrawal amount must be positive.");
Console.WriteLine($"Withdrawal: ${amount:F2}");
Console.WriteLine($"New Balance: ${Balance:F2}");
Console.WriteLine($"Error: Insufficient funds. Current balance: ${Balance:F2}");
public double GetBalance()
public abstract void DisplayAccountInfo();
public class SavingsAccount : BankAccount
public double InterestRate { get; private set; }
public SavingsAccount(string accountHolder, string accountNumber, double initialBalance, double interestRate)
: base(accountHolder, accountNumber, initialBalance)
InterestRate = interestRate;
public void CalculateInterest()
double interest = Balance * (InterestRate / 100);
Console.WriteLine("Calculating Interest (" + InterestRate + "%)...");
Console.WriteLine($"Interest Earned: ${interest:F2}");
Console.WriteLine($"New Balance: ${Balance:F2}");
public override void Withdraw(double amount)
Console.WriteLine($"Error: Insufficient funds. Current balance: ${Balance:F2}");
public override void DisplayAccountInfo()
Console.WriteLine("=== Savings Account ===");
Console.WriteLine($"Account Holder: {AccountHolder}");
Console.WriteLine($"Account Number: {AccountNumber}");
Console.WriteLine($"Balance: ${Balance:F2}");
Console.WriteLine($"Interest Rate: {InterestRate}%");
public class CheckingAccount : BankAccount
public double OverdraftLimit { get; private set; }
public CheckingAccount(string accountHolder, string accountNumber, double initialBalance, double overdraftLimit)
: base(accountHolder, accountNumber, initialBalance)
OverdraftLimit = overdraftLimit;
public override void Withdraw(double amount)
double availableBalance = Balance + OverdraftLimit;
if (availableBalance >= amount)
Console.WriteLine($"Withdrawal Attempt: ${amount:F2}");
Console.WriteLine($"Transaction successful");
Console.WriteLine($"New Balance: ${Balance:F2}");
Console.WriteLine("Warning: Account is using overdraft protection");
Console.WriteLine($"Error: Insufficient funds. Available funds (including overdraft): ${availableBalance:F2}");
public override void DisplayAccountInfo()
Console.WriteLine("=== Checking Account ===");
Console.WriteLine($"Account Holder: {AccountHolder}");
Console.WriteLine($"Account Number: {AccountNumber}");
Console.WriteLine($"Balance: ${Balance:F2}");
Console.WriteLine($"Overdraft Limit: ${OverdraftLimit:F2}");
Console.WriteLine($"Available Credit: ${OverdraftLimit:F2}");
public static void Main()
Console.WriteLine("=== Creating Accounts ===");
SavingsAccount savings = new SavingsAccount("John Doe", "SA001", 1000, 5);
savings.DisplayAccountInfo();
savings.CalculateInterest();
CheckingAccount checking = new CheckingAccount("Jane Doe", "CA001", 2000, 500);
checking.DisplayAccountInfo();
Console.WriteLine("=== Account Summary ===");
savings.DisplayAccountInfo();
checking.DisplayAccountInfo();