আপডেট: এই উত্তরটি ২০১১ সালে লেখা হয়েছিল two আমি বরং অবাক। ঘোষণার জন্য https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/ এর নীচে দেখুন ; আমি নিশ্চিত বিশদ অনুসরণ করবে।
দেখে মনে হচ্ছে আপনি যা চান তা রিটার্ন টাইপের সম্প্রচার। সি # রিটার্ন টাইপের সম্প্রচারকে সমর্থন করে না।
রিটার্ন টাইপ কোভারিয়েন্স হ'ল যেখানে আপনি বেস ক্লাস পদ্ধতিটি ওভাররাইড করেন যা একটি সুনির্দিষ্ট প্রকারকে আরও নির্দিষ্ট প্রকারের সাথে প্রত্যাবর্তন করে:
abstract class Enclosure
{
public abstract Animal Contents();
}
class Aquarium : Enclosure
{
public override Fish Contents() { ... }
}
এটি নিরাপদ কারণ এনক্লোজারের মাধ্যমে সামগ্রীগুলির গ্রাহকরা একটি প্রাণী প্রত্যাশা করে এবং অ্যাকোয়ারিয়াম কেবল এই প্রয়োজনীয়তাটিই পূরণ করবে না, তবুও আরও কঠোর প্রতিশ্রুতি দেওয়ার প্রতিশ্রুতি দেয়: যে প্রাণীটি সর্বদা একটি মাছ।
C # তে এই ধরণের কোভেরিয়েন্স সমর্থিত নয় এবং এটি কখনও সমর্থিত হওয়ার সম্ভাবনা কম। এটি সিএলআর দ্বারা সমর্থিত নয়। (এটি সি ++ এর সাহায্যে এবং সিএলআর-তে সি ++ / সিএলআই বাস্তবায়ন দ্বারা সমর্থিত; এটি নীচের প্রস্তাবিত ধরণের যাদুকরী সহায়ক পদ্ধতি তৈরি করে তা করে))
(কিছু ভাষা আনুষ্ঠানিক প্যারামিটার ধরণের বৈপরীত্যকেও সমর্থন করে - আপনি যে পদ্ধতিতে কোনও প্রাণী গ্রহণ করেন এমন একটি পদ্ধতিতে একটি মাছ গ্রহণ করে এমন কোনও পদ্ধতিকে আপনি ওভাররাইড করতে পারেন Again আবারও চুক্তিটি সম্পন্ন হয়; বেস শ্রেণীর জন্য কোনও মাছ হ্যান্ডল করা এবং প্রাপ্ত হওয়া প্রয়োজন) শ্রেণি কেবল মাছ, তবে যে কোনও প্রাণীকে পরিচালনা করবে না বলে প্রতিশ্রুতি দেয় Similarly একইভাবে, সি # এবং সিএলআর আনুষ্ঠানিক প্যারামিটার ধরণের বিপরীতে সমর্থন করে না))
আপনি এই সীমাবদ্ধতার চারপাশে কাজ করতে পারেন এমন কিছু করা:
abstract class Enclosure
{
protected abstract Animal GetContents();
public Animal Contents() { return this.GetContents(); }
}
class Aquarium : Enclosure
{
protected override Animal GetContents() { return this.Contents(); }
public new Fish Contents() { ... }
}
এখন আপনি ভার্চুয়াল পদ্ধতিকে ওভাররাইড করার এবং কম্পাইল-টাইম টাইপের অ্যাকোয়ারিয়ামের কোনও কিছু ব্যবহার করার সময় শক্তিশালী টাইপিংয়ের উভয় সুবিধা পান।