সদস্যদের আড়াল করার একমাত্র উদ্দেশ্যে সুস্পষ্ট ইন্টারফেস প্রয়োগের ভাল কারণগুলি কী?


11

সি # এর জটিলতাগুলিতে আমার এক পড়াশোনার সময়, আমি স্পষ্টভাবে ইন্টারফেস বাস্তবায়নের বিষয়ে একটি আকর্ষণীয় উত্তরণ জুড়ে এসেছি।

While this syntax is quite helpful when you need to resolve name clashes, you can use explicit interface implementation simply to hide more "advanced" members from the object level.

ব্যবহারের অনুমতি দেওয়ার object.method()বা allowing ালাইয়ের প্রয়োজনীয়তার মধ্যে পার্থক্যটি ((Interface)object).method()আমার অনভিজ্ঞ দৃষ্টিগুলিতে বোধহয় উত্সাহযুক্ত মনে হচ্ছে seems পাঠ্যটিতে উল্লেখ করা হয়েছে যে এটি বস্তুর স্তরে ইন্টেলিসেন্স থেকে পদ্ধতিটি আড়াল করবে, তবে যদি নাম বিরোধগুলি এড়ানোর প্রয়োজন না হয় তবে আপনি কেন এটি করতে চাইবেন ?


উত্তর:


12

এমন পরিস্থিতিটি কল্পনা করুন যেখানে কোনও ইন্টারফেস কোনও শ্রেণিকে এমন পদ্ধতিগুলি প্রয়োগ করতে বাধ্য করে যা ক্লাসের অংশ হিসাবে বাস্তবে বোঝায় না। এটি প্রায়শই ঘটতে পারে যখন ইন্টারফেসগুলি বিশেষত বড় হয় এবং ইন্টারফেস বিভাজন নীতি লঙ্ঘন করে।

এই শ্রেণীর ইন্টারফেস বাস্তবায়ন করা দরকার, তবে এর তাত্পর্যপূর্ণ পাবলিক ইন্টারফেসকে এমন পদ্ধতিগুলির সাথে দূষিত করার পরিবর্তে যেগুলি বোঝা যায় না, আপনি সেই পদ্ধতিগুলি স্পষ্টভাবে প্রয়োগ করতে পারেন যা আপনি স্পষ্টভাবে উপলব্ধ হতে চান না। শ্রেণীর সর্বাধিক দৃশ্যমান পাবলিক ইন্টারফেস হ'ল আপনি কীভাবে ক্লাসটি ব্যবহার করতে চান এবং ক্লাসটি ইন্টারফেসের মাধ্যমে অ্যাক্সেস করা হলে সুস্পষ্ট বাস্তবায়ন হয়।


6
এটি কি কেবল আমি, নাকি এই শব্দটি ভয়ানক ধারণাটির মতো?
কেভিন পেনো

5
@ কেভিন, কীভাবে? কখনও কখনও ইন্টারফেস আপনার নিয়ন্ত্রণের বাইরে চলে যায় এবং আপনাকে এটি ব্যবহার করতে হবে। অত্যধিক ভারী ইন্টারফেসের ক্ষতি হ্রাস করা যুক্তিসঙ্গত বলে মনে হয়।
ক্রিস পিটম্যান

1
+1 দেখিয়ে দেওয়ার জন্য যে অনেক সময় আসল পৃথিবী জিনিসগুলি করার সঠিক পথে আসে। @ কেভিন হ্যাঁ এটি একটি ভয়ানক ধারণা তবে কখনও কখনও আপনার পছন্দ হয় না এবং opালু নিয়ে কাজ করতে হয় - এটিকে আড়াল করে রাখা ভাল এবং যখন আপনি সত্যিকার অর্থে এটি সঠিকভাবে না করতে পারেন তখন জিনিসগুলি সঠিকভাবে করাতে ভাল।
ওয়েইন মোলিনা

@ ওয়েইন, আমি এই জাতীয় সিস্টেমটি চাওয়ার / ব্যবহার করার জন্য আপনার যুক্তিটি বুঝতে পারি। হেইল, আমি সম্ভবত আপনি এটি ঠিক যেভাবে ব্যবহার করেছেন তা ব্যবহার করতে চাই। আমার অনুমান যে আমার সংক্ষিপ্ত মন্তব্যটি সত্যিই কেবল এটি ইঙ্গিত করেছিল যে এটি অনুচিত, সুতরাং কেন এটি ভাষায় অনুমতি দিন।
কেভিন পেনো

1
অতিরিক্ত ইন্টারফেসের বিচ্ছেদ রচনা এবং সংহতকরণের ক্ষেত্রে একটি বড় বাধা হতে পারে। উদাহরণস্বরূপ, বিবেচনা করুন যে একজন এমন একটি বাস্তবায়ন করতে চান IEnumerable<T>যা অন্য দু'জনের সমঝোতা হিসাবে আচরণ করে। যদি IEnumerable<T>কোনও সম্পত্তি অন্তর্ভুক্ত করা হয় তবে এটির গণনাটি জানা ছিল, সম্ভাব্য অসীম, না উভয়ই এটির গণনা কী ছিল তা জিজ্ঞাসা করার পদ্ধতি সহ, যদি IEnumerable<T>একাধিককে একত্রিত করে এবং একটি কনটেন্টেশন হিসাবে আচরণ করে এমন একটি শ্রেণি দক্ষতার সাথে তার গণনার রিপোর্ট করতে পারে যে কয়েকটি এমপ্ল্যাপুলেটেড সংগ্রহগুলি তাদের গণনা জানত।
সুপারক্যাট

4

সর্বাধিক দরকারী অ্যাপ্লিকেশনটি আমি পেয়েছি কারখানাগুলি বাস্তবায়নের সাথে। অনেক ক্ষেত্রে কারখানার অভ্যন্তরে পরিবর্তনযোগ্য তবে বাহ্যিক শ্রেণীর জন্য অপরিবর্তনীয় এমন ক্লাস তৈরি করা কার্যকর। এটি জাভাতে সহজেই অভ্যন্তরীণ ক্লাসগুলি ব্যবহার করে ক্ষেত্রগুলি এবং তাদের সেটারগুলি ব্যক্তিগত করে এবং কেবল প্রাপ্ত সদস্যদের পাবলিক সদস্য হিসাবে প্রকাশ করে প্রয়োগ করা যেতে পারে। তবে সি # তে, একই জিনিসটি অর্জন করতে আমাকে সুস্পষ্ট ইন্টারফেস ব্যবহার করতে হয়েছিল। আমি আরও ব্যাখ্যা করব:

জাভাতে, অভ্যন্তরীণ শ্রেণি এবং বহিরাগত শ্রেণি একে অপরের ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে, যা ক্লাসগুলি খুব ঘনিষ্ঠভাবে সম্পর্কিত বলে পুরো বোঝায়। এগুলি একই কোড ফাইলে রয়েছে এবং সম্ভবত একই বিকাশকারী দ্বারা বিকাশ করা হয়েছে। এর অর্থ হ'ল অভ্যন্তরীণ শ্রেণীর ব্যক্তিগত ক্ষেত্রগুলি এবং পদ্ধতিগুলি এখনও তাদের মানগুলিকে সংশোধন করতে কারখানায় অ্যাক্সেস করতে পারে। তবে বহিরাগত শ্রেণিগুলি তাদের সর্বজনীন প্রাপ্তদের মাধ্যমে বাদে এই ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারবে না।

তবে, সি # তে, বাইরের শ্রেণিগুলি অভ্যন্তরীণ শ্রেণির ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে না যাতে ধারণাটি সরাসরি প্রযোজ্য না। আমি বহিরাগত শ্রেণিতে একটি ব্যক্তিগত ইন্টারফেস সংজ্ঞায়িত করে এবং স্পষ্টভাবে এটি অভ্যন্তরীণ শ্রেণিতে প্রয়োগ করে একটি স্পষ্ট ইন্টারফেসকে একটি কর্মক্ষেত্র হিসাবে ব্যবহার করেছি। এইভাবে, কেবলমাত্র বহিরাগত শ্রেণি জাভাতে করা একই পদ্ধতিতে এই ইন্টারফেসের পদ্ধতিগুলি অ্যাক্সেস করতে পারে (তবে তাদের ক্ষেত্রগুলি নয়, পদ্ধতিগুলি হতে হবে)।

উদাহরণ:

public class Factory
{
    // factory method to create a hard-coded Mazda Tribute car.
    public static Car CreateCar()
    {
        Car car = new Car();

        // the Factory class can modify the model because it has access to
        // the private ICarSetters interface
        ((ICarSetters)car).model = "Mazda Tribute";

        return car;
    }

    // define a private interface containing the setters.
    private interface ICarSetters
    {
        // define the setter in the private interface
        string model { set; }
    }

    // This is the inner class. It has a member "model" that should not be modified
    // but clients, but should be modified by the factory.
    public class Car: ICarSetters
    {
        // explicitly implement the setter
        string ICarSetters.model { set; }

        // create a public getter
        public string model { get; }
    }
}

class Client
{
    public Client()
    {
        Factory.Car car = Factory.CreateCar();

        // can only read model because only the getter is public
        // and ICarSetters is private to Factory
        string model = car.model;
    }
}

আমি এর জন্য স্পষ্ট ইন্টারফেস ব্যবহার করব।


3

কোনও শ্রেণি যদি দুটি ইন্টারফেস প্রয়োগ করে যা একই স্বাক্ষর সহ কোনও সদস্যকে ধারণ করে, তবে সেই সদস্যটিকে শ্রেণিতে প্রয়োগ করা হলে উভয় ইন্টারফেসই সেই সদস্যটিকে তাদের প্রয়োগ হিসাবে ব্যবহার করতে পারে। নিম্নলিখিত উদাহরণে, সমস্ত কল Paintএকই পদ্ধতিতে প্রার্থনা করে। সি শার্প

class Test 
{
    static void Main()

    {
        SampleClass sc = new SampleClass();
        IControl ctrl = (IControl)sc;
        ISurface srfc = (ISurface)sc;

        // The following lines all call the same method.
        sc.Paint();
        ctrl.Paint();
        srfc.Paint();
    }
}


interface IControl
{
    void Paint();
}
interface ISurface
{
    void Paint();
}
class SampleClass : IControl, ISurface
{
    // Both ISurface.Paint and IControl.Paint call this method. 
    public void Paint()
    {
        Console.WriteLine("Paint method in SampleClass");
    }
}

বিপরীতে, এগুলির একটি (বা উভয়) এর সুস্পষ্ট বাস্তবায়ন আপনাকে প্রত্যেকের জন্য আলাদা আচরণ নির্দিষ্ট করতে দেয়।


1

সুস্পষ্ট ইন্টারফেস কার্যকর হয় যখন কোনও বস্তুর মধ্যে যোগাযোগের দুটি বা ততোধিক স্বতন্ত্র রূপ থাকে।

উদাহরণস্বরূপ, এমন একটি বস্তু যা শিশুদের অবজেক্টগুলির একটি সংগ্রহ বজায় রাখে যা পিতামাতার সাথে যোগাযোগের প্রয়োজন।

কিছু ক্রিয়াকলাপ রয়েছে যা আমরা কেবলমাত্র বাহ্যিক কলারে অ্যাক্সেসযোগ্য চাই এবং কিছু ক্রিয়া আমরা কেবল শিশু বস্তুগুলিতে অ্যাক্সেসযোগ্য চাই।

সুস্পষ্ট ইন্টারফেসগুলি এই বিভাজনটি নিশ্চিত করতে সহায়তা করে।

    static void Main(string[] args)
    {
        var parent = new Parent();
        parent.DoExternalStuff();
    }

    interface IExternal {
        void DoExternalStuff();
    }

    interface IInternal {
        void DoInternalStuff();
    }

    class Parent : IExternal, IInternal
    {
        public Parent()
        {
            var child = new Child(this);
        }

        public void DoExternalStuff()
        {
           // do something exciting here for external callers
        }

        void IInternal.DoInternalStuff()
        {
            // do something exciting here for internal callers
        }
    }

    class Child
    {
        public Child(IInternal parent)
        {
            parent.DoInternalStuff();
        }
    }

0

সম্ভবত আপনার যদি কার্যকারিতাটি ব্যবহারকারীদের জন্য কার্যকর ছিল তবে আপনি যদি সত্যিই জানেন তবে আপনি কী করছেন (ফাংশনটি সম্পর্কে জানতে ডকুমেন্টেশনটি পড়ার পক্ষে যথেষ্ট) তবে আপনি যদি এটি না করেন তবে জিনিসগুলি ভাঙ্গার সম্ভাবনা রয়েছে।

আপনি কেন সরবরাহের চেয়ে এটি করতে চান, একটি দ্বিতীয় "অ্যাডভান্সড ফিচারস ইন্টারফেস" বলুন যা আমি জানি না।


0

কোডটি সাধারণত লেখার চেয়ে বেশি পড়তে হয় এবং আমি কেবল কোডটি দ্রুত লেখার জন্য ব্যবহার করি ense আমি কেবলমাত্র ইন্টেলিসেন্সকে আরও সুন্দর করার জন্য কোডটি নির্দিষ্টভাবে লিখব না।

আমি বিশেষভাবে দেখতে পাচ্ছি না কিভাবে

((ইন্টারফেস) অবজেক্ট)। মডুড () হ'ল অবজেক্ট.মোথড () এর চেয়ে আরও বেশি পঠনযোগ্য।

আমার যদি কোনও নির্দিষ্ট অবজেক্টে প্রচুর পদ্ধতি থাকে তবে আমি প্রশ্ন করতে পারি এটি কোনও godশ্বর বস্তু কিনা এবং আসলে এটি একাধিক সরল বস্তুতে বিভক্ত হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.