টেমপ্লেটগুলি বোঝার জন্য, পরিভাষাটি সোজা পাওয়া খুব সুবিধার কারণ কারণ আপনি তাদের সম্পর্কে কথা বলার উপায় সেগুলি সম্পর্কে চিন্তাভাবনার উপায় নির্ধারণ করে।
বিশেষত, Area
কোনও টেম্পলেট শ্রেণি নয়, একটি শ্রেণিবদ্ধ টেম্পলেট। এটি, এটি এমন একটি টেম্পলেট যা থেকে ক্লাস তৈরি করা যায়। Area<int>
যেমন একটি বর্গ (এটা হয় না একটি বস্তু, কিন্তু অবশ্যই আপনি একই উপায়ে আপনি অন্য কোন ক্লাস থেকে বস্তু তৈরি করতে পারেন যে বর্গ থেকে একটি বস্তু তৈরি করতে পারেন)। এরকম আরও একটি ক্লাস হবে Area<char>
। মনে রাখবেন যে সেগুলি সম্পূর্ণ আলাদা শ্রেণি, যা একই শ্রেণীর টেম্পলেট থেকে উত্পন্ন হয়েছিল তা বাদে এগুলির কিছুই সাধারণ নেই।
যেহেতু Area
কোনও ক্লাস নয়, আপনি Rectangle
এটি থেকে ক্লাসটি অর্জন করতে পারবেন না । আপনি কেবলমাত্র অন্য শ্রেণীর (বা তাদের বেশ কয়েকটি) ক্লাস পেতে পারেন। যেহেতু Area<int>
একটি শ্রেণি, আপনি উদাহরণস্বরূপ, Rectangle
এটি থেকে প্রাপ্ত করতে পারেন:
class Rectangle:
public Area<int>
{
// ...
};
যেহেতু Area<int>
এবং Area<char>
বিভিন্ন শ্রেণি, আপনি এমনকি একই সময়ে উভয় থেকে উদ্ভূত করতে পারেন (তবে তাদের সদস্যদের অ্যাক্সেস করার সময়, আপনাকে দ্ব্যর্থহীনতার মোকাবেলা করতে হবে):
class Rectangle:
public Area<int>,
public Area<char>
{
// ...
};
তবে আপনি নির্দিষ্ট করতে হবে যখন আপনি সংজ্ঞা দেবেন তখন কোনটি দ্বিধা অর্জন করতে হবে Rectangle
। এই ক্লাসগুলি কোনও টেম্পলেট থেকে উত্পন্ন হয়েছে কিনা তা নির্বিশেষে এটি সত্য। একই শ্রেণীর দুটি অবজেক্টে পৃথকভাবে উত্তরাধিকারের শ্রেণিবদ্ধতা থাকতে পারে না।
আপনি যা করতে পারেন তা হ'ল Rectangle
একটি টেম্পলেটও তৈরি করা। যদি লিখি
template<typename T> class Rectangle:
public Area<T>
{
// ...
};
আপনার কাছে এমন একটি টেম্পলেট Rectangle
রয়েছে যা থেকে আপনি একটি ক্লাস পেতে পারেন Rectangle<int>
যা থেকে এসেছে Area<int>
এবং একটি আলাদা ক্লাস Rectangle<char>
যা থেকে এসেছে Area<char>
।
এটি এমন হতে পারে যে আপনি একটি একক প্রকার রাখতে চান Rectangle
যাতে আপনি সমস্ত ধরণের Rectangle
একই ফাংশনে (যা নিজেই অঞ্চল প্রকারটি জানার প্রয়োজন হয় না) পাস করতে পারেন । যেহেতু Rectangle<T>
টেমপ্লেট ইনস্ট্যান্ট করে উত্পন্ন ক্লাসগুলি Rectangle
একে অপরের থেকে আনুষ্ঠানিকভাবে স্বতন্ত্র, এটি সেভাবে কাজ করে না। তবে আপনি এখানে একাধিক উত্তরাধিকার ব্যবহার করতে পারেন:
class Rectangle // not inheriting from any Area type
{
// Area independent interface
};
template<typename T> class SpecificRectangle:
public Rectangle,
public Area<T>
{
// Area dependent stuff
};
void foo(Rectangle&); // A function which works with generic rectangles
int main()
{
SpecificRectangle<int> intrect;
foo(intrect);
SpecificRectangle<char> charrect;
foo(charrect);
}
যদি আপনার জেনেরিকটি জেনেরিক Rectangle
থেকে উদ্ভূত হয় তবে Area
আপনার সাথে একই কৌশলটি করতে পারেন Area
:
class Area
{
// generic Area interface
};
class Rectangle:
public virtual Area // virtual because of "diamond inheritance"
{
// generic rectangle interface
};
template<typename T> class SpecificArea:
public virtual Area
{
// specific implementation of Area for type T
};
template<typename T> class SpecificRectangle:
public Rectangle, // maybe this should be virtual as well, in case the hierarchy is extended later
public SpecificArea<T> // no virtual inheritance needed here
{
// specific implementation of Rectangle for type T
};