কাস্টিং আর টাইপ কনভার্সন হলো একটি এক্সপ্রেশনকে এক ডেটা টাইপ থেকে আরেক ডেটা টাইপে বদলানোর দুটি ভিন্ন উপায়।
কাস্ট অপারেটর (<type>) দিয়ে একটি এক্সপ্রেশনকে অন্য টাইপে কাস্ট করা যায়।
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
টাইপগুলো পরস্পর সামঞ্জস্যপূর্ণ না হলে InvalidCastException-এর একটি ইনস্ট্যান্স থ্রো হয়। সংখ্যার ক্ষেত্রে এটা বোঝায়, যে টাইপে মানটি নেওয়া হচ্ছে সেটি কাস্ট করা মানটি প্রকাশ করতে পারে না। ক্লাসের ক্ষেত্রে দুটি টাইপের একটি অন্যটি থেকে ডিরাইভ করা থাকতে হবে (স্ট্রাক্টের বেলাতেও এটি সহজভাবে প্রযোজ্য)।
কাস্টিং-এর একটি বিকল্প হলো is অপারেটর ব্যবহার করে টাইপ কনভার্সন। এটি সাধারণত রেফারেন্স ও নালেবল টাইপে প্রয়োগ করা হয়।
object o = new Random();
if (o is Random rand)
{
int ii = rand.Next();
// now, do something random
}
কোনো অবজেক্টের সঠিক টাইপ শনাক্ত করতে হলে is হয়তো একটু বেশি উদার, কারণ এটি একটি ক্লাস এবং তার থেকে সরাসরি বা পরোক্ষভাবে ডিরাইভ করা যেকোনো ক্লাস ও ইন্টারফেসের জন্য true রিটার্ন করে। এক্ষেত্রে typeof আর Object.GetType()-ই সমাধান।
object o = new List<int>();
o is ICollection<int> // true
o.GetType() == typeof(ICollection<int>) // false
o is List<int> // true
o.GetType() == typeof(List<int>) // true
আমাদের ফুটবল ক্লাব football-match-reports লিগগুলোতে দ্রুত এগিয়ে চলছে, আর এবার আপনাকে আরও কিছু কাজ করার আমন্ত্রণ জানানো হয়েছে, এবার সিকিউরিটি পাস ছাপার সিস্টেম নিয়ে।
ব্যাকরুম কর্মীদের ক্লাস হায়ারার্কি নিম্নরূপ
TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
├ Physio
├ OffensiveCoach
├ GoalKeepingCoach
└ Security
├ SecurityJunior
├ SecurityIntern
└ PoliceLiaison
এই হায়ারার্কির একটি সম্পূর্ণ ইমপ্লিমেন্টেশন অনুশীলনীর সোর্স কোডের অংশ হিসেবে দেওয়া আছে।
সিকিউরিটি পাস মেকারে পাঠানো সব ডেটা যাচাই করা হয়েছে এবং তা যে null নয়, তার নিশ্চয়তা দেওয়া আছে।
অনুগ্রহ করে SecurityPassMaker.GetDisplayName() মেথডটি ইমপ্লিমেন্ট করুন। এটি Staff থেকে উদ্ভূত সব ক্লাসের ইনস্ট্যান্সের Title ফিল্ডের মান রিটার্ন করবে, অন্যথায় "Too Important for a Security Pass" রিটার্ন করবে।
var spm = new SecurityPassMaker();
spm.GetDisplayName(new Manager());
// => "Too Important for a Security Pass"
spm.GetDisplayName(new Physio());
// => "The Physio"
অনুগ্রহ করে SecurityPassMaker.GetDisplayName() মেথডটি পরিবর্তন করুন। এটি টাস্ক 1-এর মতোই আচরণ করবে, তবে স্টাফ সদস্যটি সিকিউরিটি টিমের সদস্য হলে (অর্থাৎ Security টাইপের বা তার কোনো ডেরিভেটিভ হলে) টাইটেলের পরে " Priority Personnel" লেখাটি দেখানো হবে।
var spm = new SecurityPassMaker();
spm.GetDisplayName(new Physio());
// => "The Physio"
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior Priority Personnel"
অনুগ্রহ করে SecurityPassMaker.GetDisplayName() মেথডটি পরিবর্তন করুন। এটি টাস্ক 2-এর মতোই আচরণ করবে, তবে SecurityJunior, SecurityIntern এবং PoliceLiaison টাইপের ইনস্ট্যান্সের ক্ষেত্রে " Priority Personnel" লেখাটি দেখানো হবে না।
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
Exercism-এ সাইন আপ করুন, C# ট্র্যাকের 62টি কনসেপ্ট178টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।