আসুন প্রথমে খাঁটি প্যারামেট্রিক পলিমারফিজম সম্পর্কে কথা বলি এবং পরে আবদ্ধ পলিমারফিজমে যাই।
প্যারামেট্রিক পলিমারফিজম বলতে কী বোঝায়? ঠিক আছে, এর অর্থ একটি প্রকার, বা বরং টাইপ কনস্ট্রাক্টর একটি টাইপ দ্বারা প্যারামিটারাইজড । যেহেতু প্রকারটি পরামিতি হিসাবে প্রেরণ করা হয়েছে, তাই এটি কী হতে পারে তা আপনি আগেই জানতে পারবেন না। আপনি এর উপর ভিত্তি করে কোনও অনুমান করতে পারবেন না। এখন, আপনি যদি না জানেন তবে এটি কী হতে পারে, তবে এর ব্যবহার কী? আপনি এটি দিয়ে কি করতে পারেন?
ঠিক আছে, আপনি এটি সংরক্ষণ এবং পুনরুদ্ধার করতে পারেন, উদাহরণস্বরূপ। আপনি ইতিমধ্যে উল্লিখিত কেস: সংগ্রহ। একটি তালিকা বা একটি অ্যারেতে কোনও আইটেম সংরক্ষণ করার জন্য, আইটেমটি সম্পর্কে আমার কিছু জানতে হবে না। তালিকা বা অ্যারে সম্পূর্ণ ধরণের হতে পারে না।
তবে কি Maybe
ধরণের? আপনি যদি এটির সাথে পরিচিত না হন তবে এটি Maybe
এমন এক ধরণের যা সম্ভবত একটি মান এবং সম্ভবত নাও। আপনি এটি কোথায় ব্যবহার করবেন? ঠিক আছে, উদাহরণস্বরূপ, অভিধান থেকে কোনও আইটেম বের করার সময়: কোনও আইটেম অভিধানে নাও থাকতে পারে এটি একটি ব্যতিক্রমী পরিস্থিতি নয়, সুতরাং আইটেমটি না থাকলে আপনার সত্যিকার অর্থে ব্যতিক্রম করা উচিত নয়। পরিবর্তে, আপনি একটি উপপ্রকারের উদাহরণটি ফিরে আসবেন Maybe<T>
, যার ঠিক দুটি উপপ্রকার রয়েছে: None
এবং Some<T>
। int.Parse
এমন কোনও Maybe<int>
কিছুর আর একজন প্রার্থী যা ব্যতিক্রম বা পুরো int.TryParse(out bla)
নাচ ছুঁড়ে ফেলার পরিবর্তে সত্যিকার অর্থে ফিরে আসা উচিত ।
এখন, আপনি তর্ক করতে পারেন যে Maybe
একটি তালিকা মত কিন্ডার সাজ্টা যা শুধুমাত্র শূন্য বা একটি উপাদান থাকতে পারে। এবং এইভাবে একটি সংগ্রহ কিন্ডার-বাছা।
তাহলে কি হবে Task<T>
? এটি এমন এক প্রকার যা ভবিষ্যতে কোনও সময়ে কোনও মান ফেরত দেওয়ার প্রতিশ্রুতি দেয়, তবে এখনই অগত্যা কোনও মান নেই have
বা কি Func<T, …>
? আপনি যদি কোনও ধরণের উপর বিমূর্ত করতে না পারেন তবে আপনি কীভাবে কোনও ফাংশনের ধারণাকে এক প্রকার থেকে অন্য প্রকারে উপস্থাপন করবেন?
বা আরও সাধারণভাবে: বিমূর্ততা এবং পুনঃব্যবহারটি সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের দুটি মূল ক্রিয়াকলাপ বিবেচনা করে আপনি কেন প্রকারভেদে বিমূর্ত করতে সক্ষম হবেন না ?
সুতরাং, আসুন এখন বাউন্ডেড পলিমারফিজম সম্পর্কে কথা বলি। বাউন্ডেড পলিমারফিজম মূলত যেখানে প্যারামেট্রিক পলিমারফিজম এবং সাব টাইপ পলিমারফিজম মিলিত হয়: কোনও টাইপ কনস্ট্রাক্টর তার টাইপ প্যারামিটার সম্পর্কে পুরোপুরি অসচেতন হওয়ার পরিবর্তে, আপনি টাইপটিকে কিছু নির্দিষ্ট ধরণের সাব টাইপ হিসাবে বেঁধে (বা সীমাবদ্ধ করতে পারেন )।
সংগ্রহগুলিতে ফিরে যাই। একটি হ্যাশটেবল নিন। আমরা উপরে বলেছি যে একটি তালিকার উপাদানগুলির সম্পর্কে কিছু জানার দরকার নেই। ঠিক আছে, একটি হ্যাশটেবল রয়েছে: এটি তাদের হ্যাশ করতে পারে তা জানতে হবে। (দ্রষ্টব্য: সি # তে সমস্ত বস্তু হ্যাশযোগ্য, ঠিক যেমন সমস্ত বস্তুর সমতার জন্য তুলনা করা যায়। যদিও এটি সমস্ত ভাষার ক্ষেত্রে সত্য নয়, এমনকি কখনও কখনও সি # তেও এটি ডিজাইনের ভুল হিসাবে বিবেচিত হয়))
সুতরাং, আপনি হ্যাশ টেবিলের মূল ধরণের জন্য আপনার টাইপ পরামিতিটিকে সীমাবদ্ধ করতে চান IHashable
:
class HashTable<K, V> where K : IHashable
{
Maybe<V> Get(K key);
bool Add(K key, V value);
}
পরিবর্তে আপনার যদি এটি থাকে তা কল্পনা করুন:
class HashTable
{
object Get(IHashable key);
bool Add(IHashable key, object value);
}
value
আপনি সেখান থেকে সরে যাওয়ার সাথে কি করবেন ? আপনি এটি দিয়ে কিছুই করতে পারবেন না, আপনি কেবল এটি জানেন যে এটি একটি অবজেক্ট। এবং যদি আপনি এটির উপরে পুনরাবৃত্তি করেন তবে আপনার উত্পন্ন সমস্ত কিছুই আপনার জানা জিনিসগুলির একটি জুড়ি IHashable
(যা আপনাকে খুব বেশি সহায়তা করে না কারণ এটির কেবল একটি সম্পত্তি রয়েছে Hash
) এবং আপনি object
যা জানেন সেগুলি হ'ল (যা আপনাকে আরও কম সহায়তা করে)।
বা আপনার উদাহরণের ভিত্তিতে কিছু:
class Repository<T> where T : ISerializable
{
T Get(int id);
void Save(T obj);
void Delete(T obj);
}
আইটেমটি সিরিয়ালযোগ্য হওয়া দরকার কারণ এটি ডিস্কে সঞ্চিত হতে চলেছে। তবে এর পরিবর্তে আপনার যদি এটি থাকে:
class Repository
{
ISerializable Get(int id);
void Save(ISerializable obj);
void Delete(ISerializable obj);
}
জেনেরিক মামলা, আপনি একটি করা BankAccount
, আপনি একটি পেতে BankAccount
পিছনে, পদ্ধতি ও বৈশিষ্ট্য মতো Owner
, AccountNumber
, Balance
, Deposit
, Withdraw
, ইত্যাদি কিছু আপনার সাথে কাজ করতে পারেন। এখন, অন্য মামলা? আপনি একটি রাখা BankAccount
কিন্তু আপনি ফিরে পেতে Serializable
যা মাত্র এক সম্পত্তি আছে,: AsString
। আপনি কি করতে যাচ্ছেন?
সীমাবদ্ধ পলিমারফিজম দিয়ে আপনি করতে পারেন এমন কিছু ঝরঝরে কৌশলও রয়েছে:
এফ-সীমাবদ্ধ কোয়ান্টিফিকেশন মূলত যেখানে টাইপ ভেরিয়েবল আবার সীমাবদ্ধতার মধ্যে উপস্থিত হয়। এটি কিছু পরিস্থিতিতে কার্যকর হতে পারে। যেমন আপনি কিভাবে একটি ICloneable
ইন্টারফেস লিখবেন ? আপনি কীভাবে এমন একটি পদ্ধতি লিখবেন যেখানে রিটার্নের ধরণটি প্রয়োগকারী শ্রেণীর ধরণ? মাইটাইপ বৈশিষ্ট্যযুক্ত ভাষায় এটি সহজ:
interface ICloneable
{
public this Clone(); // syntax I invented for a MyType feature
}
সীমিত পলিমারফিজমযুক্ত ভাষায়, আপনি পরিবর্তে এর মতো কিছু করতে পারেন:
interface ICloneable<T> where T : ICloneable<T>
{
public T Clone();
}
class Foo : ICloneable<Foo>
{
public Foo Clone()
{
// …
}
}
মনে রাখবেন যে এটি মাইটাইপ সংস্করণ হিসাবে নিরাপদ নয়, কারণ টাইপ কনস্ট্রাক্টরকে কাউকে কেবল "ভুল" শ্রেণিটি পাস করা থেকে বিরত করার কিছুই নেই:
class EvilBar : ICloneable<SomethingTotallyUnrelatedToBar>
{
public SomethingTotallyUnrelatedToBar Clone()
{
// …
}
}
বিমূর্ত প্রকারের সদস্যগণ
দেখা যাচ্ছে, আপনার যদি অ্যাবস্ট্রাক্ট টাইপের সদস্য এবং সাব টাইপিং থাকে তবে আপনি প্যারামেট্রিক পলিমারফিজম ছাড়াই সম্পূর্ণরূপে পেতে পারেন এবং এখনও একই জিনিসগুলি করতে পারেন। স্ক্যালালা এই দিকে এগিয়ে চলেছে, জেনারিক দিয়ে শুরু হওয়া প্রথম প্রধান ভাষা এবং সেগুলি মুছে ফেলার চেষ্টা করছে যা জাভা এবং সি # থেকে অন্যভাবে way
মূলত, স্কালায়, যেমন আপনার সদস্য হিসাবে ক্ষেত্র এবং সম্পত্তি এবং পদ্ধতি থাকতে পারে, আপনার ধরণেরও থাকতে পারে। এবং ঠিক যেমন ক্ষেত্র এবং বৈশিষ্ট্য এবং পদ্ধতিগুলি পরবর্তীতে একটি সাবক্লাসে প্রয়োগ করার জন্য বিমূর্ততা রেখে যেতে পারে, টাইপ সদস্যদেরও বিমূর্ত রাখতে পারেন। আসুন সংগ্রহগুলিতে ফিরে যাই, একটি সরল List
, এটি সি # তে সমর্থিত হলে এমন কিছু দেখায়:
class List
{
T; // syntax I invented for an abstract type member
T Get(int index) { /* … */ }
void Add(T obj) { /* … */ }
}
class IntList : List
{
T = int;
}
// this is equivalent to saying `List<int>` with generics
interface IFoo<T> where T : IFoo<T>
। এটি অবশ্যই বাস্তব জীবনের আবেদন। উদাহরণটি দুর্দান্ত। তবে কিছু কারণে আমি সন্তুষ্ট বোধ করি না। আমি বরং আমার মনটি কখন এটি উপযুক্ত এবং কখন তা নয় তা ঘিরে রাখতে চাই। উত্তরগুলির এই প্রক্রিয়াটিতে কিছুটা অবদান রয়েছে, তবে আমি এখনও নিজেকে এই সমস্ত বিষয়ে অযোগ্য মনে করছি। এটি আশ্চর্যজনক কারণ ভাষা-স্তরের সমস্যাগুলি ইতিমধ্যে এত দিন আমাকে বিরক্ত করে না।