কংক্রিট বাস্তবায়নের পরিবর্তে আমি কীভাবে ডিফল্ট পদ্ধতিটিকে কল করতে পারি


9

সি # 8 এ ডিফল্ট ইন্টারফেস পদ্ধতির আচরণ কেন পরিবর্তিত হয়েছে? অতীতে নিম্নলিখিত কোডটি (যখন ডিফল্ট ইন্টারফেস পদ্ধতিগুলি ডেমো প্রকাশিত হত না):

interface IDefaultInterfaceMethod
{
    // By default, this method will be virtual, and the virtual keyword can be here used!
    virtual void DefaultMethod()
    {
        Console.WriteLine("I am a default method in the interface!");
    }

}

interface IOverrideDefaultInterfaceMethod : IDefaultInterfaceMethod
{
    void IDefaultInterfaceMethod.DefaultMethod()
    {
        Console.WriteLine("I am an overridden default method!");
    }
}

class AnyClass : IDefaultInterfaceMethod, IOverrideDefaultInterfaceMethod
{
}

class Program
{
    static void Main()
    {
        IDefaultInterfaceMethod anyClass = new AnyClass();
        anyClass.DefaultMethod();

        IOverrideDefaultInterfaceMethod anyClassOverridden = new AnyClass();
        anyClassOverridden.DefaultMethod();
    }
}

নিম্নলিখিত আউটপুট আছে:

কনসোল আউটপুট:

আমি ইন্টারফেসে একটি ডিফল্ট পদ্ধতি!
আমি একটি ওভাররাইড ডিফল্ট পদ্ধতি!

তবে সি # 8 শেষ সংস্করণ দিয়ে উপরের কোডটি নিম্নলিখিত আউটপুট উত্পাদন করছে:

কনসোল আউটপুট:

আমি একটি ওভাররাইড ডিফল্ট পদ্ধতি!
আমি একটি ওভাররাইড ডিফল্ট পদ্ধতি!

যে কেউ আমাকে বোঝাতে পারে কেন এই আচরণটি পরিবর্তিত হয়?

বিঃদ্রঃ:

IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();

((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??

2
এর কোন পূর্ব ইন্টারফেস পদ্ধতি ছিল আগে প্রত্যাশিত ক্ষেত্রে C # এর 8. দ্বিতীয় আউটপুট - যখন আপনি একটি ইন্টারফেস পদ্ধতি বাস্তবায়ন, আপনি আশা করতে যে বলা হবে। আপনি সম্ভবত একটি পুরানো স্পেসিফিকেশন উল্লেখ করছেন? আমি আশা করি এটি পরিত্যাগ করা হয়েছে কারণ এটি একটি ইন্টারফেস পদ্ধতির প্রত্যাশিত আচরণকে ভঙ্গ করে
Panagiotis Kanavos

3
আরও ভাল প্রশ্ন হবে "কংক্রিট বাস্তবায়নের পরিবর্তে আমি কীভাবে ডিফল্ট পদ্ধতিটিকে কল করতে পারি?" যার উত্তর "আপনি এখনও করতে পারবেন না, কারণ বেস। ডিফল্ট ম্যাথোড () সিনট্যাক্সটি সি # 8 থেকে বাদ দেওয়া হয়েছিল"
পানাগিওটিস কানভোস

4
এখানে নকশার মিটিং পৃষ্ঠাটি যেখানে সি # 8 এর জন্য বেস কলগুলি আলোচনা করা হয়েছিল এবং বাদ দেওয়া হয়েছিল Cut base() syntax for C# 8. We intend to bring this back in the next major release.। এটি সঠিকভাবে কাজ করতে রানটাইম সমর্থন প্রয়োজন হবে।
পানাজিওটিস কানভোস

3
একটি ইন্টারফেস সর্বদা একটি ইন্টারফেস হয়। আমি যখন কোনও ইন্টারফেস পদ্ধতি প্রয়োগ করি তখন আমি আশা করি সমস্ত ক্লায়েন্টরা প্রয়োগকৃত পদ্ধতিতে কল করবেন। ক্লায়েন্টরা কোন ক্লাসটি পদ্ধতি প্রয়োগ করে সেদিকে খেয়াল রাখতে হবে না - তারা একটি ইন্টারফেস পেয়েছে এবং তারা এটি কল করে।
পানাজিওটিস কানভোস

2
সিনট্যাক্স আপনি পোস্ট হিসাবে, এটি একটি থেকে হওয়া আবশ্যক সত্যিই পুরাতন প্রস্তাব - DIMs শুধুমাত্র স্পষ্টভাবে বলা যেতে পারে স্পষ্টভাবে বাস্তবায়িত ইন্টারফেসগুলি মত। যে প্রস্তাব যদিও, এর ... না স্পষ্ট ইন্টারফেস সিনট্যাক্স ব্যবহার বিপরীত এর virtualআমি? এবং সম্ভবত একটি উত্তরাধিকার হীরা পরিচয় করিয়ে দেওয়া হচ্ছে
পানাগিওটিস কানভোস

উত্তর:


6

আমি সন্দেহ করি এর থেকে আরও ভাল প্রশ্ন হ'ল:

কংক্রিট বাস্তবায়নের পরিবর্তে আমি কীভাবে ডিফল্ট পদ্ধতিটিকে কল করতে পারি?

বৈশিষ্ট্যটি পরিকল্পনা করা হয়েছিল তবে এপ্রিল 2019 এ সি # 8 থেকে কাটা হয়েছিল , কারণ দক্ষ প্রয়োগের জন্য রানটাইম থেকে সমর্থন প্রয়োজন। এটি মুক্তির আগে সময়ে যুক্ত করা যায়নি। বৈশিষ্ট্যটি সি # এবং ভিবি.এনইটি - এফ # উভয়ের জন্যই ভালভাবে কাজ করতে হবে - যাইহোক ইন্টারফেস পছন্দ করে না।

বিএম যদি রান সময়ে উপস্থিত না থাকে তবে এএম () কল করা হবে। বেস () এবং ইন্টারফেসের জন্য, এটি রানটাইম দ্বারা সমর্থিত নয়, সুতরাং কলটি তার পরিবর্তে একটি ব্যতিক্রম ছুঁড়ে দেবে। আমরা রানটাইমে এটির জন্য সমর্থন যুক্ত করতে চাই, তবে এই প্রকাশটি করা খুব ব্যয়বহুল।

আমাদের কিছু কর্মক্ষেত্র রয়েছে, তবে তাদের যে আচরণটি আমরা চাই তা তেমন না এবং পছন্দসই কোডজেনও নয়।

সি # এর জন্য আমাদের বাস্তবায়ন কিছুটা কার্যক্ষম, যদিও আমরা যা চাই তা ঠিক তা নয় তবে ভিবি বাস্তবায়ন অনেক বেশি কঠিন হবে। তদুপরি, ভিবির বাস্তবায়নের জন্য ইন্টারফেস বাস্তবায়ন পদ্ধতিগুলি পাবলিক এপিআই পৃষ্ঠ হতে হবে।

এটি ক্লাসগুলি কীভাবে কাজ করেbase() তার অনুরূপ একটি কলের মাধ্যমে কাজ করবে । প্রস্তাবে উদাহরণের সহকর্মী:

interface I1
{ 
    void M(int) { }
}

interface I2
{
    void M(short) { }
}

interface I3
{
    override void I1.M(int) { }
}

interface I4 : I3
{
    void M2()
    {
        base(I3).M(0) // What does this do?
    }
}

উত্তরটি চিহ্নিত করার আগে আমি এটি কিছুক্ষণ রেখে দেব। আপনার ভাল কাজের জন্য আপনি কিছুটা আপ পেতে পারেন :-) আপনাকে ধন্যবাদ!
বাসাম আলুগিলি

1
@ বাসামআলুগিলি শুধুমাত্র এক মাস আগে কেউ অনুরূপ কিছু জিজ্ঞাসা করার কারণে । পিছনে আমি যদিও Why would you do that?। তারপরে আমি সভার মিনিটগুলি খুঁজে পেলাম
পানাজিওটিস কানভোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.