Introduction
In this exercise, we’ll delve into advanced OOP concepts by designing a complex system. Our system will involve abstract classes, interfaces, and multiple interacting classes to demonstrate the power and flexibility of these concepts.
System Design: Online Banking System
Let’s design an Online Banking System that includes various entities such as accounts, transactions, and user authentication.
Advanced OOP Concepts Utilized:
Abstract Classes: Represented by an
Account
abstract class, providing a common interface for different types of accounts.Interfaces: Used to define contracts for behaviors. An
Authentication
interface is created for user authentication.Inheritance and Polymorphism: Demonstrated through various account types (e.g.,
SavingsAccount
,CheckingAccount
) inheriting from theAccount
class.Composition: Different components (e.g.,
Transaction
class) are composed within the system to encapsulate related functionalities. ### C++ Code Implementation:
#include
#include
// Abstract class representing an account
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual void display
Balance() const = 0;
virtual ~Account() {}
};
// Interface for user authentication
class Authentication {
public:
virtual bool authenticate
User(const std::string& username, const std::string& password) const = 0;
virtual ~Authentication() {}
};
// Concrete class representing a savings account
class Savings
Account : public Account {
private:
double balance;
public:
Savings
Account() : balance(0) {}
void deposit(double amount) override {
balance += amount;
}
void withdraw(double amount) override {
if (amount <= balance) {
balance -= amount;
} else {
std::cout << "Insufficient funds\n";
}
}
void display
Balance() const override {
std::cout << "Savings Account Balance: $" << balance << "\n";
}
};
// Concrete class representing a checking account
class Checking
Account : public Account {
private:
double balance;
public:
Checking
Account() : balance(0) {}
void deposit(double amount) override {
balance += amount;
}
void withdraw(double amount) override {
if (amount <= balance) {
balance -= amount;
} else {
std::cout << "Insufficient funds\n";
}
}
void display
Balance() const override {
std::cout << "Checking Account Balance: $" << balance << "\n";
}
};
// Transaction class representing a banking transaction
class Transaction {
public:
void execute(Account& account, double amount) {
account.withdraw(amount);
}
};
// User class implementing authentication
class User : public Authentication {
public:
bool authenticate
User(const std::string& username, const std::string& password) const override {
// Simplified authentication logic for demonstration
return username == "user" && password == "password";
}
};
int main() {
// Sample usage of the Online Banking System
Savings
Account savings
Account;
Checking
Account checking
Account;
Transaction transaction;
User user;
// Authentication
if (user.authenticate
User("user", "password")) {
// Transactions
savings
Account.deposit(1000);
savings
Account.display
Balance();
transaction.execute(savings
Account, 200);
savings
Account.display
Balance();
checking
Account.deposit(500);
checking
Account.display
Balance();
} else {
std::cout << "Authentication failed\n";
}
return 0;
}
### Explanation: - `Account` is an abstract class representing the common interface for different account types (`Savings
Account`, `Checking
Account`).- `Authentication` is an interface for user authentication implemented by the `User` class.- `Transaction` is a class representing a banking transaction, showcasing composition within the system.- The `main` function demonstrates sample usage of the Online Banking System, including authentication, deposits, withdrawals, and displaying account balances.
## Conclusion
Feel free to expand upon this design, add more features, or modify the code to explore additional aspects of advanced OOP concepts. By mastering advanced OOP concepts, you've gained the ability to create modular, scalable, and maintainable designs. As you continue your architectural endeavors, apply these principles to craft software systems that stand the test of complexity and change. Happy designing!