انواع کلاس‌ها در ++C: راهنمای جامع با مثال‌های کاربردی

  • صفحه اول
  • انواع کلاس‌ها در ++C: راهنمای جامع با مثال‌های کاربردی
image

انواع کلاس‌ها در ++C: راهنمای جامع با مثال‌های کاربردی

در برنامه‌نویسی ++C، کلاس‌ها بلوک‌های اصلی ساختمان برنامه‌های شیءگرا هستند. در این مقاله به بررسی کامل انواع کلاس‌ها در ++C می‌پردازیم که هر کدام کاربردها و ویژگی‌های منحصر به فردی دارند.

1. کلاس‌های معمولی (Concrete Classes)

کلاس‌های کاملاً پیاده‌سازی شده که می‌توان مستقیماً از آنها شیء ساخت.

ویژگی‌های کلیدی:

  • دارای اعضای داده (data members) و توابع عضو (member functions)

  • قابل نمونه‌سازی (instantiation)

  • معمولاً برای مدل‌سازی موجودیت‌های ملموس استفاده می‌شوند

مثال کاربردی:

cpp
 
class BankAccount {
public:
    BankAccount(double initialBalance) : balance(initialBalance) {}
    
    void deposit(double amount) {
        balance += amount;
    }
    
    void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
        }
    }
    
    double getBalance() const {
        return balance;
    }

private:
    double balance;
};

کاربرد در پروژه‌ها:

  • مدل‌سازی موجودیت‌های کسب‌وکار

  • پیاده‌سازی ساختارهای داده

  • ایجاد کامپوننت‌های سیستم

2. کلاس‌های انتزاعی (Abstract Classes)

کلاس‌هایی که حداقل دارای یک تابع مجازی خالص (pure virtual) هستند و نمی‌توان مستقیماً از آنها شیء ساخت.

ویژگی‌های کلیدی:

  • حداقل یک تابع virtual ... = 0 دارند

  • به عنوان رابط (interface) یا پایه برای کلاس‌های دیگر عمل می‌کنند

  • معمولاً برای تعریف رفتارهای مشترک استفاده می‌شوند

مثال پیشرفته:

cpp
 
class Shape {
public:
    virtual double area() const = 0;
    virtual double perimeter() const = 0;
    virtual void draw() const = 0;
    
    // تابع غیر مجازی می‌تواند پیاده‌سازی داشته باشد
    void printInfo() const {
        std::cout << "Area: " << area() << ", Perimeter: " << perimeter() << std::endl;
    }
    
    virtual ~Shape() {} // تخریب‌کننده مجازی
};

مثال ارث‌بری از کلاس انتزاعی:

cpp
 
class Circle : public Shape {
public:
    Circle(double r) : radius(r) {}
    
    double area() const override {
        return 3.14159 * radius * radius;
    }
    
    double perimeter() const override {
        return 2 * 3.14159 * radius;
    }
    
    void draw() const override {
        std::cout << "Drawing a circle" << std::endl;
    }

private:
    double radius;
};

3. کلاس‌های پایه (Base Classes)

کلاس‌هایی که برای ارث‌بری طراحی شده‌اند و می‌توانند انتزاعی یا غیر انتزاعی باشند.

انواع کلاس‌های پایه:

  1. کلاس‌های پایه انتزاعی (برای تعریف رابط‌ها)

  2. کلاس‌های پایه غیر انتزاعی (برای استفاده مجدد از کد)

مثال پیاده‌سازی:

cpp
 
class NetworkConnection {
public:
    NetworkConnection(const std::string& address) : serverAddress(address) {}
    
    virtual void connect() {
        std::cout << "Connecting to " << serverAddress << std::endl;
    }
    
    virtual void disconnect() {
        std::cout << "Disconnecting from " << serverAddress << std::endl;
    }
    
    virtual void send(const std::string& data) = 0;
    virtual std::string receive() = 0;

protected:
    std::string serverAddress;
};

4. کلاس‌های مشتق‌شده (Derived Classes)

کلاس‌هایی که از یک یا چند کلاس پایه ارث‌بری می‌کنند.

ویژگی‌های مهم:

  • می‌توانند توابع پایه را بازنویسی (override) کنند

  • می‌توانند رفتار جدید اضافه کنند

  • از چندگانگی ارث‌بری (multiple inheritance) پشتیبانی می‌کنند

مثال چند سطحی:

cpp
 
class Animal {
public:
    virtual void eat() {
        std::cout << "Animal is eating" << std::endl;
    }
};

class Mammal : public Animal {
public:
    void breathe() {
        std::cout << "Mammal is breathing air" << std::endl;
    }
};

class Dog : public Mammal {
public:
    void eat() override {
        std::cout << "Dog is eating dog food" << std::endl;
    }
    
    void bark() {
        std::cout << "Woof!" << std::endl;
    }
};

5. کلاس‌های قالبی (Template Classes)

کلاس‌هایی که برای انواع داده‌های مختلف قابل استفاده هستند.

مثال پیشرفته:

cpp
 
template 
class FixedSizeArray {
public:
    FixedSizeArray() = default;
    
    T& operator[](size_t index) {
        if (index >= N) {
            throw std::out_of_range("Index out of range");
        }
        return data[index];
    }
    
    const T& operator[](size_t index) const {
        if (index >= N) {
            throw std::out_of_range("Index out of range");
        }
        return data[index];
    }
    
    size_t size() const { return N; }

private:
    T data[N];
};

استفاده از کلاس قالبی:

cpp
 
FixedSizeArray<int, 10> intArray;
FixedSizeArray<std::string, 5> stringArray;

6. کلاس‌های Utility (با اعضای static)

کلاس‌هایی که فقط شامل اعضای static هستند و برای گروه‌بندی توابع مرتبط استفاده می‌شوند.

مثال کاربردی:

cpp
 
class MathUtils {
public:
    static double pi() { return 3.141592653589793; }
    
    static double degToRad(double degrees) {
        return degrees * pi() / 180.0;
    }
    
    static double radToDeg(double radians) {
        return radians * 180.0 / pi();
    }
    
    // جلوگیری از ساخت نمونه از کلاس
    MathUtils() = delete;
};

// استفاده:
double angle = MathUtils::degToRad(45);

7. الگوهای طراحی کلاس

الف) Singleton

cpp
 
class DatabaseConnection {
public:
    static DatabaseConnection& getInstance() {
        static DatabaseConnection instance;
        return instance;
    }
    
    void connect() { /* ... */ }
    void disconnect() { /* ... */ }

    // جلوگیری از کپی و انتساب
    DatabaseConnection(const DatabaseConnection&) = delete;
    void operator=(const DatabaseConnection&) = delete;

private:
    DatabaseConnection() {} // سازنده خصوصی
};

ب) Factory

cpp
 
class ShapeFactory {
public:
    static std::unique_ptr createShape(const std::string& type) {
        if (type == "circle") return std::make_unique();
        if (type == "rectangle") return std::make_unique();
        return nullptr;
    }
};

ج) Strategy

cpp
 
class SortingStrategy {
public:
    virtual void sort(std::vector& data) = 0;
    virtual ~SortingStrategy() = default;
};

class QuickSort : public SortingStrategy { /* ... */ };
class MergeSort : public SortingStrategy { /* ... */ };

class Sorter {
    std::unique_ptr strategy;
public:
    void setStrategy(std::unique_ptr s) { strategy = std::move(s); }
    void sort(std::vector& data) { if (strategy) strategy->sort(data); }
};

8. کلاس‌های رابط (Interface-like Classes)

در ++C با استفاده از کلاس‌های انتزاعی با همه توابع مجازی خالص پیاده‌سازی می‌شوند.

مثال:

cpp
 
class Drawable {
public:
    virtual void draw() const = 0;
    virtual ~Drawable() = default;
};

class Clickable {
public:
    virtual void onClick() = 0;
    virtual ~Clickable() = default;
};

class Button : public Drawable, public Clickable {
    // پیاده‌سازی هر دو رابط
};

9. کلاس‌های هوشمند (Smart Classes)

کلاس‌هایی که مدیریت منابع را خودکار می‌کنند.

مثال مدیریت حافظه:

cpp
 
class MemoryBuffer {
public:
    explicit MemoryBuffer(size_t size) : size(size), data(new char[size]) {}
    
    ~MemoryBuffer() { delete[] data; }
    
    // قانون پنج‌تایی (Rule of Five)
    MemoryBuffer(const MemoryBuffer& other) : size(other.size), data(new char[other.size]) {
        std::copy(other.data, other.data + other.size, data);
    }
    
    MemoryBuffer& operator=(const MemoryBuffer& other) {
        if (this != &other) {
            delete[] data;
            size = other.size;
            data = new char[size];
            std::copy(other.data, other.data + other.size, data);
        }
        return *this;
    }
    
    MemoryBuffer(MemoryBuffer&& other) noexcept : size(other.size), data(other.data) {
        other.size = 0;
        other.data = nullptr;
    }
    
    MemoryBuffer& operator=(MemoryBuffer&& other) noexcept {
        if (this != &other) {
            delete[] data;
            size = other.size;
            data = other.data;
            other.size = 0;
            other.data = nullptr;
        }
        return *this;
    }

private:
    size_t size;
    char* data;
};

10. کلاس‌های متا (Meta-classes)

با استفاده از template metaprogramming در ++C پیاده‌سازی می‌شوند.

مثال:

cpp
 
template 
class TypeInfo {
public:
    static std::string name() {
        return typeid(T).name();
    }
    
    static constexpr bool isPointer() {
        return std::is_pointer::value;
    }
};

// استفاده:
std::cout << TypeInfo::name(); // "i" در بسیاری از کامپایلرها

جمع‌بندی

نوع کلاس کاربرد اصلی قابلیت نمونه‌سازی کلیدواژه‌های مرتبط
معمولی مدل‌سازی موجودیت‌ها بله class, public/private
انتزاعی تعریف رابط‌ها خیر virtual, =0
پایه ارث‌بری بستگی دارد : public
مشتق‌شده گسترش رفتار بله override, final
قالبی برنامه‌نویسی عمومی بله template
Utility توابع کمکی خیر static, delete
Singleton یک نمونه منحصر به فرد بله (یکبار) static, delete
رابط تعریف رفتار خیر abstract, pure virtual

انتخاب نوع مناسب کلاس بستگی به نیازهای طراحی و الگوهای معماری نرم‌افزار دارد. درک این مفاهیم به شما کمک می‌کند کدهای تمیزتر، قابل نگهداری‌تر و انعطاف‌پذیرتری بنویسید.