রোল্যান্ড ইয়াল্ডের কাছ থেকে আমি উত্তরটি পছন্দ করেছি যেহেতু তিনি টাইপ ওরফে খুব সাধারণ ব্যবহারের ক্ষেত্রে বর্ণনা করেছেন এবং আরও তথ্যের জন্য একটি খুব সুন্দর টিউটোরিয়াল উপস্থাপন করেছেন। তবে, যেহেতু টাইপ সদস্যদের নামে এই পোস্টে আরেকটি ব্যবহারের মামলা চালু করা হয়েছে , তাই আমি এর সবচেয়ে ব্যবহারিক ব্যবহারের ক্ষেত্রে উল্লেখ করতে চাই, যা আমার খুব পছন্দ হয়েছিল: (এই অংশটি এখান থেকে নেওয়া হয়েছে :)
বিমূর্ত প্রকার:
type T
উপরের টি বলেছে যে এই ধরণের যেটি ব্যবহৃত হতে চলেছে তা এখনও অজানা এবং কংক্রিটের সাবক্লাসের উপর নির্ভর করে এটি সংজ্ঞায়িত হবে। প্রোগ্রামিং ধারণাগুলি বোঝার জন্য সর্বদা সর্বোত্তম উপায় একটি উদাহরণ প্রদান করে: মনে করুন যে আপনার নিম্নলিখিত পরিস্থিতি রয়েছে:
এখানে আপনি সংকলনের ত্রুটি পাবেন, কারণ গাভী এবং টাইগার ক্লাসে খাওয়ার পদ্ধতিটি এনিমাল ক্লাসে খাওয়ার পদ্ধতিটি ওভাররাইড করে না, কারণ তাদের প্যারামিটারের ধরনগুলি পৃথক। এটি ক্লাস গাভীতে গ্রাস এবং শ্রেণিতে টাইগার বনাম মাংসের শ্রেণীর প্রাণীর খাবার যা সুপার ক্লাস এবং সমস্ত সাবক্লাসকে অবশ্যই মেনে চলতে হবে।
এখন আবার অ্যাবারস্ট্রাকশন টাইপ করুন, নিম্নলিখিত চিত্রের মাধ্যমে এবং কেবল একটি প্রকার বিমূর্ততা যুক্ত করে, আপনি ইনপুটটির ধরণটি নিজেই সাবক্লাস অনুযায়ী সংজ্ঞায়িত করতে পারেন।
এখন নিম্নলিখিত কোডগুলি দেখুন:
val cow1: Cow = new Cow
val cow2: Cow = new Cow
cow1 eat new cow1.SuitableFood
cow2 eat new cow1.SuitableFood
val tiger: Tiger = new Tiger
cow1 eat new tiger.SuitableFood // Compiler error
সংকলক খুশি এবং আমরা আমাদের নকশা উন্নত। আমরা আমাদের গরুকে গরুকে খাওয়াতে পারি S উপযুক্ত ফूड এবং সংকলক বাঘের জন্য উপযুক্ত এমন খাবারের সাথে গরুকে খাওয়ানো আমাদের আটকাবে। তবে যদি আমরা গাভী 1 SuitableFood এবং cow2 SuitabeFood এর ধরণের মধ্যে পার্থক্য করতে চাই তবে কী হবে। অন্য কথায়, কিছু দৃশ্যে এটি খুব সহজ হবে যদি আমরা যে ধরণের পথে (ধরণের অবজেক্টের মাধ্যমে) পৌঁছাতে পারি তা মূলত গুরুত্বপূর্ণ হয়ে থাকে। স্কালায় উন্নত বৈশিষ্ট্যগুলির জন্য ধন্যবাদ, এটি সম্ভব:
পাথ নির্ভরশীল প্রকারগুলি:
স্কেলা অবজেক্টের সদস্য হিসাবে প্রকার থাকতে পারে। ধরণের অর্থ, আপনি এটি অ্যাক্সেস করতে যে পথটি ব্যবহার করেন তার উপর নির্ভর করে। পথটি কোনও বস্তুর রেফারেন্স দ্বারা নির্ধারিত হয় (ওরফে কোনও শ্রেণীর উদাহরণ)। এই দৃশ্য বাস্তবায়নের জন্য আপনাকে গরুর অভ্যন্তরে ঘাসের শ্রেণি নির্ধারণ করতে হবে, যেমন গরুটি বাহ্যিক শ্রেণি এবং গ্রাসটি অভ্যন্তরীণ শ্রেণি। কাঠামোটি এরকম হবে:
class Cow extends Animal {
class Grass extends Food
type SuitableFood = Grass
override def eat(food: this.SuitableFood): Unit = {}
}
class Tiger extends Animal {
class Meat extends Food
type SuitableFood = Meat
override def eat(food: this.SuitableFood): Unit = {}
}
এখন আপনি যদি এই কোডটি সংকলনের চেষ্টা করেন:
1. val cow1: Cow = new Cow
2. val cow2: Cow = new Cow
3. cow1 eat new cow1.SuitableFood
4. cow2 eat new cow1.SuitableFood // compilation error
৪ নং লাইনে আপনি একটি ত্রুটি দেখতে পাবেন কারণ গ্রাস এখন গরুর একটি অভ্যন্তর শ্রেণি, সুতরাং গ্রাসের উদাহরণ তৈরি করতে আমাদের একটি গাভী জিনিস প্রয়োজন এবং এই গরু বস্তুটি পথ নির্ধারণ করে। সুতরাং 2 গরু বস্তু 2 টি পৃথক পথে উত্সাহ দেয়। এই দৃশ্যে, কাউ 2 কেবল এটির জন্য তৈরি বিশেষত খাবার খেতে চায়। তাই:
cow2 eat new cow2.SuitableFood
এখন সবাই খুশি :-)