انواع کلاسها در ++C: راهنمای جامع با مثالهای کاربردی
در برنامهنویسی ++C، کلاسها بلوکهای اصلی ساختمان برنامههای شیءگرا هستند. در این مقاله به بررسی کامل انواع کلاسها در ++C میپردازیم که هر کدام کاربردها و ویژگیهای منحصر به فردی دارند.
فهرست مطالب
- 1. کلاسهای معمولی (Concrete Classes)
- 2. کلاسهای انتزاعی (Abstract Classes)
- 3. کلاسهای پایه (Base Classes)
- 4. کلاسهای مشتقشده (Derived Classes)
- 5. کلاسهای قالبی (Template Classes)
- 6. کلاسهای Utility (با اعضای static)
- 7. الگوهای طراحی کلاس
- 8. کلاسهای رابط (Interface-like Classes)
- 9. کلاسهای هوشمند (Smart Classes)
- 10. کلاسهای متا (Meta-classes)
- جمعبندی
1. کلاسهای معمولی (Concrete Classes)
کلاسهای کاملاً پیادهسازی شده که میتوان مستقیماً از آنها شیء ساخت.
ویژگیهای کلیدی:
-
دارای اعضای داده (data members) و توابع عضو (member functions)
-
قابل نمونهسازی (instantiation)
-
معمولاً برای مدلسازی موجودیتهای ملموس استفاده میشوند
مثال کاربردی:
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) یا پایه برای کلاسهای دیگر عمل میکنند
-
معمولاً برای تعریف رفتارهای مشترک استفاده میشوند
مثال پیشرفته:
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() {} // تخریبکننده مجازی
};
مثال ارثبری از کلاس انتزاعی:
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)
کلاسهایی که برای ارثبری طراحی شدهاند و میتوانند انتزاعی یا غیر انتزاعی باشند.
انواع کلاسهای پایه:
-
کلاسهای پایه انتزاعی (برای تعریف رابطها)
-
کلاسهای پایه غیر انتزاعی (برای استفاده مجدد از کد)
مثال پیادهسازی:
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) پشتیبانی میکنند
مثال چند سطحی:
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)
کلاسهایی که برای انواع دادههای مختلف قابل استفاده هستند.
مثال پیشرفته:
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];
};
استفاده از کلاس قالبی:
FixedSizeArray<int, 10> intArray;
FixedSizeArray<std::string, 5> stringArray;
6. کلاسهای Utility (با اعضای static)
کلاسهایی که فقط شامل اعضای static هستند و برای گروهبندی توابع مرتبط استفاده میشوند.
مثال کاربردی:
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
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
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
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 با استفاده از کلاسهای انتزاعی با همه توابع مجازی خالص پیادهسازی میشوند.
مثال:
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)
کلاسهایی که مدیریت منابع را خودکار میکنند.
مثال مدیریت حافظه:
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 پیادهسازی میشوند.
مثال:
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 |
انتخاب نوع مناسب کلاس بستگی به نیازهای طراحی و الگوهای معماری نرمافزار دارد. درک این مفاهیم به شما کمک میکند کدهای تمیزتر، قابل نگهداریتر و انعطافپذیرتری بنویسید.