کلاس های عمومی
تعریف یک کلاس جنریک بسیار شبیه به تعریف یک متد جنریک است. کلاس جنریک دارای یک علامت بزرگتر و کوچکتر و یک نوع پارامتر خاص میباشد. برنامه زیر مثالی از یک کلاس جنریک میباشد :
#include <iostream> using namespace std; template<class T> class GenericClass { private: T someField; public: GenericClass(T someVariable) { someField = someVariable; } T getSomeProperty() { return someField; } void setSomeProperty(T value) { someField = value; } }; int main() { GenericClass<double> genericDouble(30.50); GenericClass<int> genericInt(10); cout << "genericDouble.SomeProperty = " << genericDouble.getSomeProperty() << endl; cout << "genericInt.SomeProperty = " << genericInt.getSomeProperty() << endl; }
genericDouble.SomeProperty = 30.50 genericInt.SomeProperty = 10
در مثال بالا یک کلاس جبریک که دارای یک فیلد، یک خاصیت و یک سازنده است را ایجاد میکنیم. تمام مکانهایی که ورودی T در آنها قرار دارد بعداً توسط انواعی که مد نظر شما است، جایگزین میشوند. وقتی یک نمونه از کلاس جنریک تان ایجاد میکنید، یک نوع هم برای آن در نظر بگیرید (<int>). مانند متدهای جنریک میتوانید چندین نوع پارامتر به کلاسهای جنریک اختصاص دهید.
template<class T1,class T2, class T3> class GenericClass { private: T1 someField1; T2 someField2; T3 someField3; };
کلاسهای جنریک میتوانند از کلاسهای جنریک ارث بری کنند اما کلاس های فرزند اجازه داشتن ویژگی های کلاس های جنریک والد را ندارند:
template<class T1> class Parent { //some code }; template<class T> class Child: public Parent<T> { //some code };
کلاسهای غیر جنریک میتوانند از کلاسهای جنریک ارث بری کنند، اما باید نوع آرگومان های کلاس جنریک باید در زمان ارث بری (در حین کدنویسی) به صورت زیر مشخص شوند:
class Child : public GenericClass<int> { //some code };
یک کلاس جنریک هم میتواند از یک کلاس غیر جنریک ارث بری کند.
template<class T> class Child: public Parent { //some code };