এছাড়াও মনে রাখবেন যে লিনক ক্যোয়ারিকে তাদের সি # শৈলীতে ব্যবহার করার সময় আরও পঠনযোগ্য হতে সহায়তা করার জন্য এক্সটেনশন পদ্ধতিগুলি যুক্ত করা হয়েছিল।
এই 2 প্রভাবগুলি একেবারে সমতুল্য, তবুও প্রথমটি আরও বেশি পাঠযোগ্য (
int n1 = new List<int> {1,2,3}.Where(i => i % 2 != 0).Last();
int n2 = Enumerable.Last(Enumerable.Where(new List<int> {1,2,3}, i => i % 2 != 0));
দ্রষ্টব্য যে সম্পূর্ণরূপে যোগ্যতাসম্পন্ন বাক্য গঠনটি এমনও হওয়া উচিত:
int n1 = new List<int> {1,2,3}.Where<int>(i => i % 2 != 0).Last<int>();
int n2 = Enumerable.Last<int>(Enumerable.Where<int>(new List<int> {1,2,3}, i => i % 2 != 0));
সুযোগক্রমে , টাইপ পরামিতিগুলির Where
এবং Last
স্পষ্টভাবে উল্লেখ করার প্রয়োজন নেই কারণ এ দুটি পদ্ধতির প্রথম প্যারামিটারের উপস্থিতি (কীওয়ার্ড দ্বারা প্রবর্তিত প্যারামিটারের জন্য তাদের ধন্যবাদ জানানো যেতে পারে)this
এবং তাদের এক্সটেনশন পদ্ধতি করা)।
স্পষ্টতই এই পয়েন্টটি এক্সটেনশন পদ্ধতিগুলির একটি সুবিধা (অন্যদের মধ্যে), এবং আপনি এর অনুরূপ প্রতিটি দৃশ্যে এর থেকে সুবিধা নিতে পারেন যেখানে পদ্ধতিতে শৃঙ্খলা জড়িত।
বিশেষত, এটি আরও মার্জিত এবং দৃ conv়প্রত্যয়ী উপায় বলে আমি খুঁজে পেয়েছি যে কোনও বেস ক্লাস পদ্ধতিটি যে কোনও সাবক্লাস দ্বারা চালিত হয় এবং এই সাবক্লাসের (সাবক্লাসের ধরণের সাথে) একটি দৃ typ়ভাবে টাইপযুক্ত রেফারেন্স ফিরে পাওয়া যায়।
উদাহরণ (ঠিক আছে, এই দৃশ্যটি সম্পূর্ণ চিত্তাকর্ষক): একটি শুভরাত্রির পরে, একটি প্রাণী চোখ খোলে তারপরে চিৎকার দেয়; প্রতিটি প্রাণী একইভাবে চোখ খুলে দেয়, যেখানে একটি কুকুর ছোঁয়া এবং হাঁসের কোয়াক্স।
public abstract class Animal
{
}
public static class AnimalExtension
{
public static TAnimal OpenTheEyes<TAnimal>(this TAnimal animal) where TAnimal : Animal
{
return animal;
}
}
public class Dog : Animal
{
public void Bark() { }
}
public class Duck : Animal
{
public void Kwak() { }
}
class Program
{
static void Main(string[] args)
{
Dog Goofy = new Dog();
Duck Donald = new Duck();
Goofy.OpenTheEyes().Bark();
Donald.OpenTheEyes().Kwak();
}
}
ধারণাগতভাবে OpenTheEyes
একটি Animal
পদ্ধতি হওয়া উচিত , তবে এটি বিমূর্ত শ্রেণির একটি উদাহরণ ফিরে আসতে Animal
পারে, যা নির্দিষ্ট সাবক্লাস পদ্ধতিগুলি যেমন Bark
বা যা কিছু জানে না Duck
। 2 টি লাইন * 1 এবং * 2 হিসাবে মন্তব্য করেছে তারপরে একটি সংকলন ত্রুটি বাড়িয়ে তুলবে।
তবে এক্সটেনশন পদ্ধতিগুলির জন্য ধন্যবাদ, আমাদের কাছে এমন একটি "বেস পদ্ধতি থাকতে পারে যা সাবক্লাসের ধরণটি জানায় যার উপর এটি বলা হয়"।
মনে রাখবেন যে একটি সাধারণ জেনেরিক পদ্ধতিটি কাজটি করতে পারত তবে আরও বিশ্রী পদ্ধতিতে:
public abstract class Animal
{
public TAnimal OpenTheEyes<TAnimal>() where TAnimal : Animal
{
return (TAnimal)this;
}
}
এবার, কোনও প্যারামিটার এবং এইভাবে কোনও সম্ভাব্য রিটার্ন ইনফারেন্স নেই। কলটি ছাড়া আর কিছুই হতে পারে না:
Goofy.OpenTheEyes<Dog>().Bark();
Donald.OpenTheEyes<Duck>().Kwak();
... যা আরও শৃঙ্খলা জড়িত থাকলে কোডটি অনেকটা ওজন করতে পারে (বিশেষত জেনে থাকুন যে টাইপ প্যারামিটারটি সর্বদা <Dog>
গোফির লাইনে এবং <Duck>
ডোনাল্ডের একটিতে থাকবে ...)