ইন্টারফেস - কী বিষয়?


269

ইন্টারফেসের কারণ আমাকে সত্যই বাদ দেয়। আমি যা বুঝতে পারি তা থেকে এটি অস্তিত্বহীন বহু-উত্তরাধিকারের জন্য কাজ যা সি # তে উপস্থিত নেই (বা আমাকে বলা হয়েছিল)।

আমি যা দেখছি তা হ'ল, আপনি কিছু সদস্য এবং কার্যাদি পূর্বনির্ধারিত করেছেন, যা আবার ক্লাসে পুনরায় সংজ্ঞায়িত করতে হবে। সুতরাং ইন্টারফেস অপ্রয়োজনীয় তৈরি। এটি কেবল সিনট্যাকটিকের মতো মনে হচ্ছে ... ভাল, আমার কাছে আবর্জনা (দয়া করে কোনও অপরাধের অর্থ নয়। অকেজো জিনিস হিসাবে জঞ্জাল)।

স্ট্যাক ওভারফ্লোতে আলাদা সি # ইন্টারফেস থ্রেড থেকে নেওয়া নীচে দেওয়া উদাহরণে, আমি কেবল ইন্টারফেসের পরিবর্তে পিজ্জা নামে একটি বেস ক্লাস তৈরি করব।

সহজ উদাহরণ (একটি পৃথক স্ট্যাক ওভারফ্লো অবদান থেকে নেওয়া)

public interface IPizza
{
    public void Order();
}

public class PepperoniPizza : IPizza
{
    public void Order()
    {
        //Order Pepperoni pizza
    }
}

public class HawaiiPizza : IPizza
{
    public void Order()
    {
        //Order HawaiiPizza
    }
}

আমার এখানে এই প্রশ্নের ডুপ্লিকেট রয়েছে বলে মনে হচ্ছে, তবে তারা সকলেই কেবল একটি ইন্টারফেসের চুক্তির অংশটি ব্যাখ্যা করে বলে মনে হচ্ছে যাতে আমি নিশ্চিত যে তারা প্রয়োগ করেছে।
ল্যাসে ভি কার্লসেন

7
একটি সুন্দর এবং পরিচ্ছন্ন ব্যবহারকারী হওয়ার চেষ্টা করছি, আমি কিছু পোস্ট করার আগে আমার ফোরামটি প্রথমে বিভিন্ন ফোরামে সন্ধান করার প্রবণতা রাখি। দুর্ভাগ্যক্রমে, তাদের বেশিরভাগ পরবর্তী পর্যায়ে শুরু হয়েছিল এবং বাকিরা কোনও সাহায্য করেনি। আমি ইতিমধ্যে "কেন এটি করি" বেসিকটি নিয়ে লড়াই করে যাচ্ছিলাম? যেমনটি আমার কাছে এটি অপ্রয়োজনীয় ওভার কমপ্লিকেটিংয়ের মতো বলে মনে হয়েছিল। BTW। খুব দ্রুত উত্তরের জন্য সকলকে ধন্যবাদ। আমাকে প্রথমে সেগুলি হজম করতে হবে তবে আমি মনে করি তাদের কাছে এখনই আমি যুক্তিসঙ্গতভাবে ভাল ধারণা পেয়েছি। দেখে মনে হচ্ছে আমি সবসময় এটিকে অন্য একটি কোণ থেকে দেখেছি। আপনার সাহায্যের জন্য অসংখ্য ধন্যবাদ.
নেবেলহম


1
এছাড়াও ইন্টারফেস structপ্রকারের মতো উত্তরাধিকার প্রতিষ্ঠায় সহায়তা করে ।
j72

3
হুম, ওপি জিজ্ঞাসা করছিল "আমি যা বুঝি তা থেকে ইন্টারফেসটি সি-# তে বিদ্যমান নন বহু-উত্তরাধিকারের জন্য কাজ করা। এটি বাদে উদ্ধৃত পাঠ্যপুস্তক পিজ্জার উদাহরণে) আমি ঠিক বলব ইন্টারফেসের পরিবর্তে একটি বেস ক্লাস ব্যবহার করুন "। এবং তারপরে সর্বাধিক উত্তরগুলি একটি উদাহরণ দিয়েছে যা একটি (বিমূর্ত) বেস বর্গ দ্বারা প্রয়োগ করা যেতে পারে, বা মাল্টি-ইনটিয়েন্স দৃশ্যের জন্য ইন্টারফেস কীভাবে প্রয়োজনীয় তা দেখানোর জন্য একটি উদাহরণ দিয়েছিল। এই উত্তরগুলি সব ভাল, কিন্তু তারা কি ওপি ইতিমধ্যে জানে এমন কিছু পুনরাবৃত্তি করছে না? এতে কোনও আশ্চর্যের বিষয় নয় যে ওপি উদাহরণ ছাড়াই উত্তর বেছে নিয়েছেন। LOL
রায়লুও

উত্তর:


176

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

তারপরে আপনি একটি ইন্টারফেসের বিভিন্ন বাস্তবায়ন করতে পারেন এবং ইচ্ছামত এগুলি সরিয়ে নিতে পারেন। আপনার উদাহরণে, যেহেতু প্রতিটি পিজ্জা উদাহরণ হ'ল IPizzaআপনি IPizzaযেখানেই অজানা পিজ্জা টাইপের উদাহরণ হ্যান্ডেল করতে পারবেন তা ব্যবহার করতে পারেন । কোন দৃষ্টান্ত যার ধরণ থেকে উত্তরাধিকারী IPizzaনিশ্চিত করা হয়, orderable হতে কেননা এতে একটি হয়েছে Order()পদ্ধতি।

পাইথনটি স্ট্যাটিকালি টাইপড নয়, তাই টাইপগুলি রানটাইমের সময় রাখা হয় এবং দেখা হয়। সুতরাং আপনি যে Order()কোনও বস্তুতে কোনও পদ্ধতি কল করার চেষ্টা করতে পারেন । রানটাইম খুশী যতক্ষণ না অবজেক্টটির এমন পদ্ধতি আছে এবং সম্ভবত কেবল সরিয়ে ফেলে says মেহ «বলে যদি এটি না হয়। সি # তে তেমন নয়। সংকলকটি সঠিক কল করার জন্য দায়বদ্ধ এবং এটির কিছুটা এলোমেলো objectসংকলন থাকলেও রানটাইম চলাকালীন উদাহরণটি সেই পদ্ধতিতে থাকবে কিনা তা এখনও কম্পাইলার জানেন না। সংকলকের দৃষ্টিকোণ থেকে এটি অবৈধ কারণ এটি এটি যাচাই করতে পারে না। (আপনি প্রতিচ্ছবি বা dynamicকীওয়ার্ড দিয়ে এই জাতীয় কাজগুলি করতে পারেন , তবে এটি এখন খানিকটা দূরে চলেছে, আমার ধারণা))

এছাড়াও মনে রাখবেন যে স্বাভাবিক অর্থে একটি ইন্টারফেসটি অবশ্যই সি # interfaceহতে হবে না, এটি একটি বিমূর্ত শ্রেণি বা এমনকি একটি সাধারণ শ্রেণিও হতে পারে (যা যদি উপশ্রেণীর কিছু সাধারণ কোড ভাগ করে নেওয়া প্রয়োজন তবে কার্যকর হতে পারে - বেশিরভাগ ক্ষেত্রেই তবে, interfaceযথেষ্ট)।


1
+1, যদিও আমি বলব না যে ইন্টারফেসটি (একটি চুক্তির অর্থে) একটি বিমূর্ত বা একটি সাধারণ শ্রেণি হতে পারে।
গ্রো

3
আমি যুক্ত করব যে আপনি কয়েক মিনিটের মধ্যে ইন্টারফেস বুঝতে আশা করতে পারবেন না। আমি মনে করি আপনার যদি বছরের পর বছর অবজেক্ট ভিত্তিক প্রোগ্রামিংয়ের অভিজ্ঞতা না থাকে তবে ইন্টারফেসগুলি বোঝা যুক্তিসঙ্গত নয়। আপনি বইগুলিতে কিছু লিঙ্ক যুক্ত করতে পারেন। আমি পরামর্শ দেব: নেট মধ্যে ডিপেন্ডেন্সি ইনজেকশন, যা কেবলমাত্র একটি মৃদু ভূমিকা নয়, খরগোশের গর্তটি কতটা গভীরভাবে যায় is
নট

2
আহা, আমার ডিআই-র কোনও ক্লু না থাকার সমস্যা আছে। তবে আমি অনুমান করি যে প্রশ্নকারীর মূল সমস্যাটি হ'ল পাইথন এ সমস্ত কাজ ছাড়াই কেন তাদের প্রয়োজন। এটিই আমার উত্তরের বৃহত্তম অনুচ্ছেদটি সরবরাহ করার চেষ্টা করেছিল। আমি মনে করি না যে এখানে প্রতিটি ইন্টারফেস ব্যবহার করে এমন প্রতিটি প্যাটার্ন এবং অনুশীলন খনন করা দরকার।
জোয়

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

3
@ বালুকপাপুকুগলু: এর বাইরেও, যদি কোনও স্ট্যাটিক্যালি টাইপযুক্ত কোনও অবজেক্টের সাথে যদি কেউ fooপ্রয়োগগুলি জানে IWidget, তবে কোনও প্রোগ্রামার কল করার foo.woozle()জন্য ডকুমেন্টেশনটি দেখতে IWidgetএবং জানতে পারবেন যে পদ্ধতিটি কী করবে তা বোঝা যাচ্ছে । প্রকৃত বাস্তবায়নের কোডটি কোথা থেকে আসবে তা প্রোগ্রামারের কাছে জানার কোনও উপায় নাও থাকতে পারে তবে IWidgetইন্টারফেস চুক্তি অনুসারে যে কোনও প্রকার fooসেই চুক্তির সাথে সামঞ্জস্যপূর্ণ পদ্ধতিতে কার্যকর হবে । গতিশীল ভাষায়, বিপরীতে, এর foo.woozle()অর্থ কী হওয়া উচিত তার কোনও পরিষ্কার রেফারেন্স পয়েন্ট থাকবে না ।
ক্যাট

440

ইন্টারফেসগুলি কীভাবে কার্যকর তা সত্যিই কেউ স্পষ্টভাবে ব্যাখ্যা করতে পারেনি, তাই আমি এটিকে একটি শট দিতে যাচ্ছি (এবং শামীমের উত্তরটি থেকে কিছুটা ধারণা চুরি করেছি)।

পিজ্জা অর্ডার করার পরিষেবাটি ধারণা নিতে দিন। আপনার একাধিক ধরণের পিজ্জা থাকতে পারে এবং প্রতিটি পিজ্জার একটি সাধারণ ক্রিয়া সিস্টেমে অর্ডার প্রস্তুত করছে। প্রতিটি পিজ্জা প্রস্তুত করতে হবে তবে প্রতিটি পিজ্জা আলাদাভাবে প্রস্তুত হয় । উদাহরণস্বরূপ, যখন স্টাফড ক্রাস্ট পিজ্জা অর্ডার করা হয় তখন সিস্টেমটিকে সম্ভবত রেস্তোঁরাগুলিতে কিছু উপাদান পাওয়া যায় তা যাচাই করে ডিপ থালা পিজ্জার জন্য প্রয়োজন হয় না এমনগুলি নির্ধারণ করতে হয়।

কোডে এটি লেখার সময়, প্রযুক্তিগতভাবে আপনি কেবল করতে পারতেন

public class Pizza()
{
    public void Prepare(PizzaType tp)
    {
        switch (tp)
        {
            case PizzaType.StuffedCrust:
                // prepare stuffed crust ingredients in system
                break;

            case PizzaType.DeepDish:
                // prepare deep dish ingredients in system
                break;

            //.... etc.
        }
    }
}

যাইহোক, ডিপ ডিশ পিজ্জা (সি # পদে) Prepare()স্টাফড ক্রাস্টের চেয়ে পদ্ধতিতে আলাদা আলাদা বৈশিষ্ট্য নির্ধারণের প্রয়োজন হতে পারে এবং এর ফলে আপনি প্রচুর alচ্ছিক বৈশিষ্ট্য অর্জন করতে পারেন এবং ক্লাসটি ভালভাবে স্কেল করে না (যদি আপনি নতুন যুক্ত করেন তবে কি হবে? পিজা প্রকারের)।

এটি সমাধানের সঠিক উপায় হ'ল ইন্টারফেস ব্যবহার করা। ইন্টারফেস ঘোষণা করে যে সমস্ত পিজ্জা প্রস্তুত করা যেতে পারে তবে প্রতিটি পিজ্জা আলাদাভাবে প্রস্তুত করা যায়। সুতরাং আপনার যদি নিম্নলিখিত ইন্টারফেস থাকে:

public interface IPizza
{
    void Prepare();
}

public class StuffedCrustPizza : IPizza
{
    public void Prepare()
    {
        // Set settings in system for stuffed crust preparations
    }
}

public class DeepDishPizza : IPizza
{
    public void Prepare()
    {
        // Set settings in system for deep dish preparations
    }
}

এখন আপনার অর্ডার হ্যান্ডলিং কোডটি উপাদানগুলি পরিচালনা করার জন্য ঠিক কী ধরণের পিজ্জা অর্ডার করা হয়েছিল তা জানা দরকার নেই। এটি ঠিক আছে:

public PreparePizzas(IList<IPizza> pizzas)
{
    foreach (IPizza pizza in pizzas)
        pizza.Prepare();
}

যদিও প্রতিটি ধরণের পিজ্জা আলাদাভাবে প্রস্তুত করা হয়, কোডের এই অংশে আমরা কী ধরণের পিজ্জা নিয়ে কাজ করছি সেদিকে খেয়াল রাখতে হবে না, এটি কেবল জানেন যে এটি পিজ্জার জন্য আহ্বান করা হচ্ছে এবং তাই প্রতিটি কল Prepareস্বয়ংক্রিয়ভাবে প্রতিটি পিজ্জা সঠিকভাবে প্রস্তুত করবে knows এর ধরণের ভিত্তিতে, এমনকি যদি সংগ্রহটিতে একাধিক ধরণের পিজ্জা থাকে।


11
+1, আমি একটি ইন্টারফেসের ব্যবহার দেখানোর জন্য একটি তালিকা ব্যবহারের উদাহরণ পছন্দ করেছি।
ড্যানিল্যান্ডারউডউড

21
উত্তম উত্তর, তবে সম্ভবত এটি ব্যাখ্যা করার জন্য এটি সংশোধন করে কেন এই ক্ষেত্রে একটি ইন্টারফেস কেবল একটি বিমূর্ত শ্রেণি ব্যবহারের চেয়ে ভাল (যেমন একটি সাধারণ উদাহরণের জন্য, একটি বিমূর্ত শ্রেণি আসলেই আরও ভাল হতে পারে?)
জেজ

3
এটি সেরা উত্তর। এখানে একটি ছোট টাইপ রয়েছে বা আপনি কেবল কোডটি অনুলিপি করে আটকান। সি # ইন্টারফেসে আপনি অ্যাক্সেস সংশোধক যেমন ঘোষণা করেন না public। ইন্টারফেসের ভিতরে তাই এটি ঠিক হওয়া উচিতvoid Prepare();
23:58

26
আমি দেখতে পাচ্ছি না কীভাবে এটি প্রশ্নের উত্তর দেয়। এই উদাহরণটি খুব সহজেই বেস ক্লাস এবং একটি বিমূর্ত পদ্ধতিতে সম্পন্ন করা যেত, মূল প্রশ্নটি যেটি নির্দেশ করেছিল ঠিক তেমনই।
জেমি কিটসন

4
ইন্টারফেসগুলি সত্যই তাদের ডানে আসে না যতক্ষণ না আপনি তাদের প্রচুর ঘুরে বেড়াচ্ছেন। আপনি কেবলমাত্র একটি একক শ্রেণীর কাছ থেকে উত্তরাধিকারী হতে পারেন, বিমূর্ত বা না, তবে আপনি নিজের পছন্দ অনুযায়ী একক শ্রেণিতে অনেকগুলি ভিন্ন ইন্টারফেস প্রয়োগ করতে পারেন। হঠাৎ আপনার দরজার ফ্রেমে একটি দরজা লাগবে না; আইওপেনেবল যা কিছু তা করবে, এটি একটি দরজা, উইন্ডো, একটি লেটারবক্স হোক, আপনি এটির নাম দিন।
mtnielsen

123

আমার জন্য, যখন শুরু করার সাথে সাথে এগুলির পয়েন্টটি তখনই স্পষ্ট হয়ে যায় যখন আপনি আপনার কোডটি সহজ / দ্রুত লেখার বিষয় হিসাবে তাদের হিসাবে দেখা বন্ধ করে দেন - এটি তাদের উদ্দেশ্য নয়। তাদের বেশ কয়েকটি ব্যবহার রয়েছে:

(এটি পিজ্জা উপমা হারাতে চলেছে, কারণ এটির ব্যবহারটি কল্পনা করা খুব সহজ নয়)

বলুন আপনি স্ক্রিনে একটি সহজ গেম তৈরি করছেন এবং এতে এমন প্রাণীর উপস্থিতি রয়েছে যার সাথে আপনি ইন্টারঅ্যাক্ট করেন।

উত্তর: ভবিষ্যতে আপনার সামনের প্রান্ত এবং আপনার পিছনের শেষের প্রয়োগের মধ্যে একটি আলগা দম্পতি প্রবর্তন করে তারা ভবিষ্যতে আপনার কোড বজায় রাখা সহজ করতে পারে।

আপনি এটি শুরুতে লিখতে পারতেন, কারণ কেবল ট্রল হতে চলেছে:

// This is our back-end implementation of a troll
class Troll
{
    void Walk(int distance)
    {
        //Implementation here
    }
}

সামনের অংশ:

function SpawnCreature()
{
    Troll aTroll = new Troll();

    aTroll.Walk(1);
}

দুই সপ্তাহ অবধি, বিপণন স্থির করে নিন যে আপনার ওআরকেও দরকার, যেমন তারা টুইটারে তাদের সম্পর্কে পড়ে, তাই আপনাকে এরকম কিছু করতে হবে:

class Orc
{
    void Walk(int distance)
    {
        //Implementation (orcs are faster than trolls)
    }
}

সামনের অংশ:

void SpawnCreature(creatureType)
{
    switch(creatureType)
    {
         case Orc:

           Orc anOrc = new Orc();
           anORc.Walk();

          case Troll:

            Troll aTroll = new Troll();
             aTroll.Walk();
    }
}

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

interface ICreature
{
    void Walk(int distance)
}

public class Troll : ICreature
public class Orc : ICreature 

//etc

সামনের প্রান্তটি তখন:

void SpawnCreature(creatureType)
{
    ICreature creature;

    switch(creatureType)
    {
         case Orc:

           creature = new Orc();

          case Troll:

            creature = new Troll();
    }

    creature.Walk();
}

সামনের প্রান্তটি কেবল ইন্টারফেস আইক্রিচারের বিষয়ে চিন্তা করে - এটি কোনও ট্রল বা একটি অর্কের অভ্যন্তরীণ বাস্তবায়ন সম্পর্কে মাথা ঘামায় না, তবে কেবল তারা আইক্রিচারকে বাস্তবায়িত করে।

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

এবং আপনি কোনও কারখানায় সৃজনটি বের করতে পারবেন:

public class CreatureFactory {

 public ICreature GetCreature(creatureType)
 {
    ICreature creature;

    switch(creatureType)
    {
         case Orc:

           creature = new Orc();

          case Troll:

            creature = new Troll();
    }

    return creature;
  }
}

এবং আমাদের সামনের প্রান্তটি তখন হয়ে যাবে:

CreatureFactory _factory;

void SpawnCreature(creatureType)
{
    ICreature creature = _factory.GetCreature(creatureType);

    creature.Walk();
}

এখন সামনের প্রান্তে এমনকি লাইব্রেরি যেখানে ট্রল এবং অর্ক প্রয়োগ করা হয়েছে তার কোনও উল্লেখ নেই (কারখানাটি একটি পৃথক লাইব্রেরিতে সরবরাহ করা হয়) - এটি তাদের সম্পর্কে কিছুই জানতে হবে না।

বি: বলুন যে আপনার কার্যকারিতা রয়েছে যে কেবলমাত্র কিছু প্রাণী আপনার অন্যথায় সমজাতীয় ডেটা কাঠামোতে থাকবে , যেমন

interface ICanTurnToStone
{
   void TurnToStone();
}

public class Troll: ICreature, ICanTurnToStone

সম্মুখ সমাপ্তি তখন হতে পারে:

void SpawnCreatureInSunlight(creatureType)
{
    ICreature creature;

    switch(creatureType)
    {
         case Orc:

           creature = new Orc();

          case Troll:

            creature = new Troll();
    }

    creature.Walk();

    if (creature is ICanTurnToStone)
    {
       (ICanTurnToStone)creature.TurnToStone();
    }
}

সি: নির্ভরতা ইনজেকশন জন্য ব্যবহার

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

public interface ICreatureFactory {
     ICreature GetCreature(string creatureType);
}

আমাদের সামনের প্রান্তে কনস্ট্রাক্টরের মাধ্যমে সাধারণত (সাধারণত একটি এমভিসি এপিআই নিয়ন্ত্রণকারী) ইনজেকশন দেওয়া যেতে পারে (সাধারণত):

public class CreatureController : Controller {

   private readonly ICreatureFactory _factory;

   public CreatureController(ICreatureFactory factory) {
     _factory = factory;
   }

   public HttpResponseMessage TurnToStone(string creatureType) {

       ICreature creature = _factory.GetCreature(creatureType);

       creature.TurnToStone();

       return Request.CreateResponse(HttpStatusCode.OK);
   }
}

আমাদের ডিআই ফ্রেমওয়ার্ক (যেমন নিনজেক্ট বা অটোফ্যাক) এর সাহায্যে আমরা এগুলি সেট আপ করতে পারি যাতে রানটাইমের সময় যখন কোনও কনস্ট্রাক্টরে আইক্রিটিচারফ্যাক্টরি প্রয়োজন হয় তখন ক্রাইচারফ্যাক্টির একটি উদাহরণ তৈরি হবে - এটি আমাদের কোডটিকে সুন্দর এবং সহজ করে তোলে।

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

ডি: অন্যান্য ব্যবহার রয়েছে যেমন আপনার দুটি প্রকল্প 'এ' এবং 'বি' রয়েছে যা 'উত্তরাধিকারের কারণে' সুগঠিত নয়, এবং এ এর ​​বিতে একটি উল্লেখ রয়েছে A

এরপরে আপনি বি তে কার্যকারিতা পাবেন যা ইতিমধ্যে এ-তে একটি পদ্ধতিতে কল করতে হবে যা আপনি একটি বিজ্ঞপ্তিযুক্ত রেফারেন্স পেয়েছেন আপনি কংক্রিট বাস্তবায়ন ব্যবহার করে এটি করতে পারবেন না।

আপনার বিতে ঘোষিত একটি ইন্টারফেস থাকতে পারে যা এ এর ​​পরে শ্রেণি প্রয়োগ করে। আপনার বিতে পদ্ধতিটি এমন কোনও শ্রেণীর উদাহরণ দিয়ে যেতে পারে যা কোনও সমস্যা ছাড়াই ইন্টারফেস প্রয়োগ করে, যদিও কংক্রিট অবজেক্ট এ এর ​​ধরণের হয় even


6
এটা বিরক্তিকর যখন আপনি একটি উত্তর অর্থাৎ কি আপনি ছিলেন চেষ্টা ছিল এটি নয়, কিন্তু অনেক বেশি ভালো এটা আছে - stackoverflow.com/a/93998/117215
ধান

18
সুসংবাদটি এখন এটি একটি মৃত পৃষ্ঠা এবং আপনার নয় :)। ভালো উদাহরণ!
সিলার_05

1
আপনার সি আলোচনা আমাকে কিছুটা হারিয়েছে। তবে, আমি আপনার এ এবং বি আলোচনা পছন্দ করি কারণ তারা উভয়ই মূলত ব্যাখ্যা করে যে একাধিক ক্লাস জুড়ে সাধারণ ধরণের কার্যকারিতা সরবরাহ করতে ইন্টারফেসগুলি কীভাবে ব্যবহার করা যেতে পারে। ইন্টারফেসের ক্ষেত্র যা এখনও আমার কাছে অস্পষ্ট তা হ'ল কীভাবে ইন্টারফেসগুলি আলগা কাপলিংয়ের জন্য ব্যবহৃত হয়। সম্ভবত এটিই আপনার সি আলোচনা সম্বোধন করছিল? যদি তা হয় তবে অনুমান করি আমার আরও বিশদ উদাহরণ প্রয়োজন :)
ব্যবহারকারী 2075599

1
আপনার উদাহরণে আমার কাছে মনে হয়েছে যে আইক্রিচারটি ট্রোল এবং অর্কের জন্য একটি বিমূর্ত বেস ক্লাস (ক্রিচার?) হওয়ার পক্ষে আরও উপযুক্ত হবে। তারপরে প্রাণীদের মধ্যে যে কোনও সাধারণ যুক্তি প্রয়োগ করা যেতে পারে। যার অর্থ আপনার আইক্রিচার ইন্টারফেসটি একেবারেই প্রয়োজন নেই ...
স্কারসনিক

1
@ স্কারসনিক - বেশ, যা এই নোটটি সম্পর্কে এটি: "এই দৃষ্টিকোণ থেকে এটি দেখার সময় লক্ষ্য করার জন্য একটি গুরুত্বপূর্ণ বিষয় হ'ল আপনি সহজেই একটি বিমূর্ত প্রাণী শ্রেণিও ব্যবহার করতে পারতেন এবং এই দৃষ্টিকোণ থেকে এটি একই রকম ছিল প্রভাব। "
ধান 22

33

এখানে আপনার উদাহরণগুলি পুনরায় ব্যাখ্যা করা হয়েছে:

public interface IFood // not Pizza
{
    public void Prepare();

}

public class Pizza : IFood
{
    public void Prepare() // Not order for explanations sake
    {
        //Prepare Pizza
    }
}

public class Burger : IFood
{
    public void Prepare()
    {
        //Prepare Burger
    }
}

27

উপরের উদাহরণগুলি খুব বেশি বোঝায় না। আপনি ক্লাস ব্যবহার করে উপরের সমস্ত উদাহরণগুলি সম্পাদন করতে পারেন (আপনি যদি কেবল চুক্তি হিসাবে আচরণ করতে চান তবে বিমূর্ত শ্রেণিটি) ):

public abstract class Food {
    public abstract void Prepare();
}

public class Pizza : Food  {
    public override void Prepare() { /* Prepare pizza */ }
}

public class Burger : Food  {
    public override void Prepare() { /* Prepare Burger */ }
}

আপনি ইন্টারফেসের মতো একই আচরণ পান। আপনি এমন একটি তৈরি করতে পারেন List<Food>এবং পুনরাবৃত্তি করতে পারেন যা ডাব্লু / ও ও ক্লাসের শীর্ষে কী রয়েছে তা জেনে।

আরও পর্যাপ্ত উদাহরণ একাধিক উত্তরাধিকার হবে:

public abstract class MenuItem {
    public string Name { get; set; }
    public abstract void BringToTable();
}

// Notice Soda only inherits from MenuItem
public class Soda : MenuItem {
    public override void BringToTable() { /* Bring soda to table */ }
}


// All food needs to be cooked (real food) so we add this
// feature to all food menu items
public interface IFood {
    void Cook();
}

public class Pizza : MenuItem, IFood {
    public override void BringToTable() { /* Bring pizza to table */ }
    public void Cook() { /* Cook Pizza */ }
}

public class Burger : MenuItem, IFood {
    public override void BringToTable() { /* Bring burger to table */ }
    public void Cook() { /* Cook Burger */ }
}

তারপরে আপনি এগুলি সমস্ত হিসাবে ব্যবহার করতে পারেন MenuItemএবং তারা প্রতিটি পদ্ধতি কল কীভাবে পরিচালনা করে তা যত্ন করে না।

public class Waiter {
    public void TakeOrder(IEnumerable<MenuItem> order) 
    {
        // Cook first
        // (all except soda because soda is not IFood)
        foreach (var food in order.OfType<IFood>())
            food.Cook();

        // Bring them all to the table
        // (everything, including soda, pizza and burger because they're all menu items)
        foreach (var menuItem in order)
            menuItem.BringToTable();
    }
}

2
আমাকে "এখানে একটি ইন্টারফেসের পরিবর্তে কেবল একটি বিমূর্ত শ্রেণি কেন ব্যবহার করবেন না?" প্রশ্নের উত্তর দেওয়ার জন্য একটি উত্তর খুঁজতে এখানে পুরোপুরি স্ক্রোল করতে হয়েছিল। দেখে মনে হচ্ছে এটি কেবলমাত্র সি এর একাধিক উত্তরাধিকারের অভাবকে পরিচালনা করবে।
সিন্ট্যাক্সরুলস 21

2
হ্যাঁ এটি আমার পক্ষে সেরা ব্যাখ্যা। কেবলমাত্র একটি যা স্পষ্টভাবে ব্যাখ্যা করে যে কেন একটি বিমূর্ত শ্রেণীর চেয়ে ইন্টারফেস বেশি কার্যকর হতে পারে। (যেমন: একটি পিজ্জা একটি মেনু আইটেম এবং এটি খাদ্যও যখন কোনও বিমূর্ত শ্রেণীর সাথে এটি কেবল এক বা অন্য দুটি হতে পারে তবে উভয়ই নয়)
ম্যাক্সটার

25

সাদৃশ্য সহ সাধারণ ব্যাখ্যা

সমস্যা সমাধানের: বহুমুখী উদ্দেশ্য কী?

সাদৃশ্য: সুতরাং আমি একটি নির্মাণ সাইটে একজন উপদেষ্টা।

ব্যবসায়ীরা সারাক্ষণ নির্মাণ সাইটে হাঁটেন। আমি জানি না কে এই দরজা দিয়ে হেঁটে যাচ্ছে। তবে আমি মূলত তাদের বলি কী করা উচিত।

  1. যদি এটি কোনও ছুতার হয় তবে আমি বলি: কাঠের ভারা তৈরি করুন।
  2. যদি এটি প্লাম্বার হয় তবে আমি বলি: "পাইপগুলি সেট আপ করুন"
  3. যদি এটি বৈদ্যুতিক হয় তবে আমি বলি "তারগুলি বের করুন এবং সেগুলি ফাইবার অপটিক দ্বারা প্রতিস্থাপন করুন"।

উপরোক্ত পদ্ধতির সমস্যাটি হ'ল আমাকে: (i) কে জানতে পারে সেই দরজাটিতে কে চলছে, এবং এটি কে, তার উপর নির্ভর করে আমাকে তাদের কী করতে হবে তা জানাতে হবে। তার মানে একটি নির্দিষ্ট বাণিজ্য সম্পর্কে আমার সব কিছু জানতে হবে। এই পদ্ধতির সাথে ব্যয় / সুবিধা রয়েছে:

কী করবেন তা জেনে যাওয়ার প্রভাবগুলি:

  • এর অর্থ যদি কার্টিন্টারের কোডটি পরিবর্তিত হয়: BuildScaffolding()থেকে BuildScaffold()(অর্থাত্ সামান্য নাম পরিবর্তন) হয় তবে আমাকে কলিং ক্লাসও (অর্থাত্ Forepersonক্লাস) পরিবর্তন করতে হবে - আপনাকে কোডের পরিবর্তে দুটি মূল পরিবর্তন করতে হবে (মূলত ) শুধু একটি. পলিমারফিজমে আপনার (মূলত) একই ফলাফল অর্জনের জন্য কেবল একটি পরিবর্তন করা দরকার।

  • দ্বিতীয়ত আপনাকে ক্রমাগত জিজ্ঞাসা করতে হবে না: আপনি কে? ঠিক আছে এই কর ... তুমি কে? ঠিক আছে যে ..... বহুরূপীকরণ - এটি কোডটি DRYs করে এবং কিছু পরিস্থিতিতে খুব কার্যকর:

  • পলিমারফিজম সহ আপনি কোনও বিদ্যমান কোড পরিবর্তন না করে সহজেই ব্যবসায়ীদের অতিরিক্ত ক্লাস যুক্ত করতে পারেন। (অর্থাত সলিড ডিজাইনের নীতিগুলির দ্বিতীয়: ওপেন-ক্লোজ নীতি)।

সমাধান

এমন দৃশ্যের কল্পনা করুন যেখানে, দরজায় কে চলে যায়, আমি বলতে পারি: "ওয়ার্ক ()" এবং তারা তাদের বিশেষ সম্মানের কাজটি করে যা তারা পাইপগুলি ব্যবহার করবে এবং বৈদ্যুতিক তারের সাথে কাজ করবে।

এই পদ্ধতির সুবিধাটি হ'ল: (i) সেই দরজাটি দিয়ে কে প্রবেশ করছে ঠিক তা জানতে আমার দরকার নেই - আমার কেবল এতটা জানা দরকার যে তারা এক ধরণের ট্রেডি হবে এবং তারা কাজ করতে পারে এবং দ্বিতীয়ত second , (ii) সেই বিশেষ বাণিজ্য সম্পর্কে আমার কিছু জানার দরকার নেই। ট্রেডি এটি যত্ন নেবে।

সুতরাং এর পরিবর্তে:

If(electrician) then  electrician.FixCablesAndElectricity() 

if(plumber) then plumber.IncreaseWaterPressureAndFixLeaks() 

আমি এরকম কিছু করতে পারি:

ITradesman tradie = Tradesman.Factory(); // in reality i know it's a plumber, but in the real world you won't know who's on the other side of the tradie assignment.

tradie.Work(); // and then tradie will do the work of a plumber, or electrician etc. depending on what type of tradesman he is. The foreman doesn't need to know anything, apart from telling the anonymous tradie to get to Work()!!

লাভ কী?

সুবিধাটি হ'ল যদি ছুতার ইত্যাদির নির্দিষ্ট কাজের প্রয়োজনীয়তাগুলি পরিবর্তন হয় তবে তার পক্ষে তার কোড পরিবর্তন করার দরকার নেই - তাকে জানার বা যত্ন নেওয়ার দরকার নেই। সর্বোপরি গুরুত্বপূর্ণ এটি হ'ল ছুতার জানে যে ওয়ার্ক () বলতে কী বোঝায়। দ্বিতীয়ত, যদি নতুন ধরণের নির্মাণকর্মী যদি কাজের সাইটে আসে তবে ফোরম্যানকে ব্যবসায়ের বিষয়ে কিছু জানার দরকার নেই - সমস্ত ফোরম্যান যত্নশীল যদি নির্মাণকর্মী (.eg ওয়েল্ডার, গ্লাজিয়ার, টাইলার ইত্যাদি) পারেন তবে কিছু কাজ () সম্পন্ন করা।


সচিত্র সমস্যা এবং সমাধান (ইন্টারফেসের সাথে এবং ছাড়া):

কোনও ইন্টারফেস নেই (উদাহরণ 1):

উদাহরণ 1: একটি ইন্টারফেস ছাড়া

কোনও ইন্টারফেস নেই (উদাহরণ 2):

উদাহরণ 2: একটি ইন্টারফেস ছাড়া

একটি ইন্টারফেস সহ:

উদাহরণ 3: একটি ইন্টারফেস ব্যবহারের সুবিধা

সারসংক্ষেপ

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

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


4
হুডির কাজ করতে আসা লোকটির জন্য আরও একটি।
ইউশা

11

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


3
+1 এটি ঠিক, আপনার যদি হাঁসের টাইপিং থাকে তবে আপনার ইন্টারফেসের প্রয়োজন হবে না। তবে তারা শক্তিশালী ধরণের সুরক্ষা প্রয়োগ করে।
গ্রো

11

পিজ্জার উদাহরণটি খারাপ কারণ আপনি অর্ডারিং পরিচালনা করে এমন একটি বিমূর্ত ক্লাস ব্যবহার করা উচিত এবং উদাহরণস্বরূপ, পিজ্জা কেবল পিজ্জা টাইপকে ওভাররাইড করা উচিত।

আপনার কোনও ভাগ করা সম্পত্তি থাকলে আপনি ইন্টারফেস ব্যবহার করেন তবে আপনার ক্লাসগুলি বিভিন্ন জায়গা থেকে উত্তরাধিকার সূত্রে আসে বা যখন আপনার ব্যবহার করতে পারে এমন কোনও সাধারণ কোড নেই। উদাহরণস্বরূপ, এটি ব্যবহৃত জিনিসগুলি নিষ্পত্তি করা যায়IDisposable , আপনি জানেন যে এটি নিষ্পত্তি হবে, আপনি কেবল জানেন না যে এটি নিষ্পত্তি হওয়ার পরে কী হবে।

একটি ইন্টারফেস হ'ল একটি চুক্তি যা আপনাকে কোনও জিনিস বলতে পারে যা কিছু করতে পারে, কোন পরামিতি এবং কী কী প্রত্যাশা প্রত্যাশা করে।


10

আপনি বেস ক্লাস নিয়ন্ত্রণ বা মালিক না এমন ক্ষেত্রে বিবেচনা করুন।

উদাহরণস্বরূপ ভিজ্যুয়াল নিয়ন্ত্রণগুলি নিন, উইনফর্মগুলির জন্য .NET এ তারা সবাই বেস ক্লাস নিয়ন্ত্রণ থেকে উত্তরাধিকারী হন, এটি সম্পূর্ণ নেট। ফ্রেমওয়ার্কে সংজ্ঞায়িত।

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

উদাহরণস্বরূপ আপনি এগুলি পরিচালনা করার একটি সাধারণ উপায় বা স্থানীয়করণ হ্যান্ডেল করার একটি সাধারণ উপায় চাইবেন।

এই ক্ষেত্রে আপনি "কেবলমাত্র একটি বেস ক্লাস তৈরি করতে পারবেন না" কারণ আপনি যদি এটি করেন তবে আপনাকে নিয়ন্ত্রণগুলির সাথে সম্পর্কিত সমস্ত কিছু পুনরায় প্রতিস্থাপন করতে হবে।

পরিবর্তে আপনি বাটন, টেক্সটবক্স, তালিকাভিউ, গ্রিডভিউ, ইত্যাদি থেকে নেমে আপনার কোড যুক্ত করবেন।

তবে এটি একটি সমস্যা তৈরি করে, এখন আপনি কীভাবে নিয়ন্ত্রণগুলি "আপনার" তা সনাক্ত করতে পারেন, আপনি কীভাবে এমন কিছু কোড তৈরি করতে পারেন যা বলে যে "আমার যে ফর্মের সমস্ত নিয়ন্ত্রণের জন্য, থিমটি এক্স এ সেট করুন" says

ইন্টারফেস লিখুন।

ইন্টারফেসগুলি কোনও অবজেক্টের দিকে তাকানোর একটি উপায় যা নির্ধারণ করে যে বস্তুটি একটি নির্দিষ্ট চুক্তির সাথে সম্মতি দেয়।

আপনি "আপনার বাটন" তৈরি করবেন, বাটন থেকে নেবেন এবং আপনার প্রয়োজনীয় সমস্ত ইন্টারফেসের জন্য সমর্থন যুক্ত করবেন।

এটি আপনাকে নীচের মত কোড লেখার অনুমতি দেবে:

foreach (Control ctrl in Controls)
{
    if (ctrl is IMyThemableControl)
        ((IMyThemableControl)ctrl).SetTheme(newTheme);
}

ইন্টারফেস ছাড়া এটি সম্ভব হবে না, পরিবর্তে আপনাকে এই জাতীয় কোড লিখতে হবে:

foreach (Control ctrl in Controls)
{
    if (ctrl is MyThemableButton)
        ((MyThemableButton)ctrl).SetTheme(newTheme);
    else if (ctrl is MyThemableTextBox)
        ((MyThemableTextBox)ctrl).SetTheme(newTheme);
    else if (ctrl is MyThemableGridView)
        ((MyThemableGridView)ctrl).SetTheme(newTheme);
    else ....
}

হ্যাঁ, আমি জানি, আপনার "ইজ" ব্যবহার করা উচিত নয় এবং পরে কাস্ট করা উচিত, এটিকে একপাশে রেখে দিন।
ল্যাসে ভি কার্লসেন

4
দীর্ঘশ্বাস আমি জানি, তবে এটি এখানে ঘটনাচক্রে।
ল্যাসে ভি কার্লসেন

7

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

  1. একটি শ্রেণি একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে। এটি কেবল ক্লাসের থাকা বৈশিষ্ট্যগুলি সংজ্ঞায়িত করে। বিভিন্ন শ্রেণীর ইন্টারফেস প্রয়োগের অর্থ একটি শ্রেণি বিভিন্ন স্থানে একাধিক ফাংশন সম্পাদন করতে পারে।

  2. ক্লাস বা কলারের চেয়ে একটি ইন্টারফেস হোগার স্কোপে সংজ্ঞায়িত করা যায়। এর অর্থ হ'ল আপনি কার্যকারিতা পৃথক করতে পারবেন, প্রকল্পের নির্ভরতা পৃথক করতে পারবেন এবং কার্যকারিতাটি একটি প্রকল্প বা শ্রেণিতে রাখতে পারবেন এবং এর অন্য কোথাও প্রয়োগ করতে পারবেন।

2 এর একটি নিদর্শন হ'ল আপনি যে শ্রেণিটি ব্যবহৃত হচ্ছে তা পরিবর্তন করতে পারেন, এটি প্রয়োজনীয় ইন্টারফেস প্রয়োগ করে।


6

বিবেচনা করুন আপনি সি # তে একাধিক উত্তরাধিকার ব্যবহার করতে পারবেন না, এবং আপনার প্রশ্নটি আবার দেখুন look



4

যদি আমি আকারগুলি আঁকার জন্য কোনও এপিআই-তে কাজ করে থাকি তবে আমি ডাইরেক্টএক্স বা গ্রাফিক কল বা ওপেনজিএল ব্যবহার করতে পারি। সুতরাং, আমি একটি ইন্টারফেস তৈরি করব যা আপনার কল থেকে আমার প্রয়োগকে বিমূর্ত করবে।

আপনি এখন একটি কারখানা পদ্ধতি আহবান MyInterface i = MyGraphics.getInstance()। তারপরে, আপনার একটি চুক্তি রয়েছে, তাই আপনি কী ফাংশনগুলি আশা করতে পারেন তা আপনি জানেন MyInterface। সুতরাং, আপনি কল করতে পারেন i.drawRectangleবা i.drawCubeসন্দেহাতীতভাবে জেনো যে, যদি আপনি অন্য জন্য এক গ্রন্থাগার আউট অদলবদল, যে ফাংশন সমর্থিত।

আপনি যদি ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে থাকেন তবে এটি আরও গুরুত্বপূর্ণ হয়ে ওঠে, আপনি কোনও এক্সএমএল ফাইলে, বাস্তবায়নগুলি অদলবদল করতে পারেন।

সুতরাং, আপনার কাছে একটি ক্রিপ্টো লাইব্রেরি থাকতে পারে যা রপ্তানি করা যেতে পারে যা সাধারণ ব্যবহারের জন্য এবং অন্যটি কেবল আমেরিকান সংস্থাগুলির কাছে বিক্রয়ের জন্য, এবং পার্থক্যটি হ'ল আপনি একটি কনফিগার ফাইল পরিবর্তন করেছেন, এবং বাকি প্রোগ্রামগুলি নয় পরিবর্তন করেছেন।

List.NET- এ সংগ্রহের ক্ষেত্রে এটি দুর্দান্ত ব্যবহার করা হয়, যেমন আপনার কেবল ব্যবহার করা উচিত, উদাহরণস্বরূপ, ভেরিয়েবলগুলি এবং এটি কোনও অ্যারেলিস্ট বা লিংকডলিস্ট কিনা তা নিয়ে চিন্তা করবেন না।

যতক্ষণ আপনি ইন্টারফেসে কোড করেন ততক্ষণ বিকাশকারী প্রকৃত বাস্তবায়ন পরিবর্তন করতে পারবেন এবং প্রোগ্রামের বাকী অংশটি অপরিবর্তিত রয়েছে।

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


4

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

আপনার উদাহরণে, ইন্টারফেস তৈরি করা হয় কারণ তখন যে কিছু একটা IS পিজা, যার মানে কার্যকরী পিজা ইন্টারফেস, বাস্তবায়িত হয়েছে বলে নিশ্চিত করা হয়

public void Order();

আপনার উল্লিখিত কোডের পরে আপনার এমন কিছু থাকতে পারে:

public void orderMyPizza(IPizza myPizza) {
//This will always work, because everyone MUST implement order
      myPizza.order();
}

এইভাবে আপনি বহুবিজ্ঞান ব্যবহার করছেন এবং আপনার যত্নের বিষয় হ'ল আপনার অবজেক্টগুলি অর্ডারে সাড়া দেয় ()।


4

আমি এই পৃষ্ঠায় "রচনা" শব্দটির জন্য অনুসন্ধান করেছি এবং এটি একবারও দেখিনি। এই উত্তরটি পূর্ব বর্ণিত উত্তরগুলি ছাড়াও খুব বেশি।

কোনও অবজেক্ট ওরিয়েন্টেড প্রকল্পের ইন্টারফেসগুলি ব্যবহারের জন্য অত্যন্ত গুরুত্বপূর্ণ কারণগুলির মধ্যে একটি হ'ল তারা আপনাকে উত্তরাধিকারের তুলনায় সংমিশ্রণের পক্ষে অনুমতি দেয়। ইন্টারফেস প্রয়োগ করে আপনি যে প্রয়োগগুলি প্রয়োগ করছেন সেগুলি থেকে আপনি আপনার প্রয়োগগুলি দ্বিগুণ করতে পারেন।

ডেরেক বানাসের এই দুর্দান্ত "ডেকোরেটর প্যাটার্ন" টিউটোরিয়াল (যা উদাহরণস্বরূপ যথেষ্ট পরিমাণে পিৎজা ব্যবহার করে) একটি উপযুক্ত চিত্রণ:

https://www.youtube.com/watch?v=j40kRwSm4VE


2
আমি সত্যিই হতবাক হয়েছি যে এটি সেরা উত্তর নয়। তাদের সমস্ত কার্যকারিতার ইন্টারফেসগুলি, রচনাতে সবচেয়ে বেশি ব্যবহৃত হয়।
ম্যাকিয়েজ সিটকো

3

ইন্টারফেসগুলি বিভিন্ন শ্রেণীর মধ্যে সংযোগ প্রয়োগের জন্য। উদাহরণস্বরূপ, আপনার গাড়ি এবং গাছের জন্য একটি ক্লাস রয়েছে;

public class Car { ... }

public class Tree { ... }

আপনি উভয় শ্রেণির জন্য একটি জ্বলনযোগ্য কার্যকারিতা যুক্ত করতে চান। তবে প্রতিটি শ্রেণীর নিজস্ব জ্বলন্ত উপায় রয়েছে। সুতরাং আপনি সহজভাবে তৈরি;

public class Car : IBurnable
{
public void Burn() { ... }
}

public class Tree : IBurnable
{
public void Burn() { ... }
}

2
প্রশ্ন যেমন আমাকে উদাহরণস্বরূপ হান্ট করে: এটি কেন সাহায্য করে? আমি কি এখন IBurnable টাইপের যুক্তিকে কোনও পদ্ধতিতে পাস করতে পারি এবং IBurnable ইন্টারফেস সহ সমস্ত শ্রেণি পরিচালনা করা যায়? আমি পাইজ্জার উদাহরণ হিসাবে একই। আপনি এটি করতে পারেন এটি দুর্দান্ত, তবে আমি সুবিধাটি দেখতে পাচ্ছি না। আপনি হয় উদাহরণটি প্রসারিত করতে পারেন (কারণ আমি এই মুহুর্তে সত্যই ঘন) বা এমন উদাহরণ দিতে পারি যা এটির সাথে কাজ করবে না (আবার, কারণ আমি এই মুহুর্তে সত্যিই ঘন অনুভব করি)। অনেক ধন্যবাদ.
নেবেলহম

1
একমত। ইন্টারফেস = "করতে পারে"। শ্রেণি / বিমূর্ত ক্যালস = "এটি একটি"
পিটার.ওয়াং

3

আপনি ইন্টারফেস পাবেন, যখন আপনি তাদের প্রয়োজন হবে :) আপনি উদাহরণ অধ্যয়ন করতে পারেন, তবে আপনার আহা প্রয়োজন! সত্যিই তাদের পেতে প্রভাব।

এখন আপনি জানেন যে ইন্টারফেসগুলি কী, কেবল তা ছাড়া কোড। যত তাড়াতাড়ি বা পরে আপনি কোনও সমস্যার মধ্যে চলে যাবেন, যেখানে ইন্টারফেসের ব্যবহার করা সবচেয়ে স্বাভাবিক কাজ হবে।


3

আমি অবাক হয়েছি যে অনেকগুলি পোস্টে একটি ইন্টারফেসের জন্য সবচেয়ে গুরুত্বপূর্ণ কারণ থাকে না: নকশার প্যাটার্নস । এটি চুক্তিগুলি ব্যবহারের ক্ষেত্রে আরও বড় চিত্র, এবং যদিও এটি মেশিন কোডের একটি সিনট্যাক্স সজ্জা (সত্য কথা বলতে গেলে, সংকলক সম্ভবত কেবল তাদের উপেক্ষা করে), বিমূর্ততা এবং ইন্টারফেসগুলি ওওপি, মানবিক বোঝাপড়া এবং জটিল সিস্টেম আর্কিটেকচারের জন্য গুরুত্বপূর্ণ।

আসুন পিজ্জা সাদৃশ্যটি একটি পূর্ণ শ্রেনীর 3 কোর্সের খাবারের জন্য বাড়িয়ে তুলি। Prepare()আমাদের সকল খাদ্য বিভাগের জন্য এখনও আমাদের মূল ইন্টারফেস থাকবে , তবে আমরা অবশ্যই কোর্স নির্বাচনের বিমূর্ত ঘোষণা (স্টার্টার, মূল, মিষ্টি) এবং খাবারের ধরণের জন্য পৃথক পৃথক বৈশিষ্ট্য (সেভরি / মিষ্টি, নিরামিষ নিরামিষ / নিরামিষ নিরামিষ, আঠালো মুক্ত ইত্যাদি)।

এই স্পেসিফিকেশনের উপর ভিত্তি করে, পুরো প্রক্রিয়াটি ধারণার জন্য আমরা অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্নটি প্রয়োগ করতে পারি , তবে কেবলমাত্র ভিত্তিই দৃ concrete় ছিল তা নিশ্চিত করার জন্য ইন্টারফেসগুলি ব্যবহার করে। সমস্ত কিছু নমনীয় হতে পারে বা বহুবিজ্ঞানকে উত্সাহিত করতে পারে, তবুও ইন্টারফেসটি Courseপ্রয়োগ করে এমন বিভিন্ন শ্রেণীর মধ্যে এনক্যাপসুলেশন বজায় রাখে ICourse

আমার আরও সময় থাকলে আমি এর একটি সম্পূর্ণ উদাহরণ আঁকতে চাই, বা কেউ আমার জন্য এটি বাড়িয়ে দিতে পারে, তবে সংক্ষেপে, এই ধরণের সিস্টেম ডিজাইনের ক্ষেত্রে একটি সি # ইন্টারফেসই সেরা হাতিয়ার হবে।


1
এই উত্তরটি আরও বেশি পয়েন্টের দাবিদার! ইন্টারফেসগুলি যখন নকশাকৃত নিদর্শনগুলিতে যেমন রাজ্য প্যাটার্ন ব্যবহার করা হয় তখন উজ্জ্বল হয়। অতিরিক্ত তথ্যের জন্য Plus.google.com/+ZoranHorvat- প্রোগ্রামিং দেখুন
অ্যালেক্স নোলাস্কো

3

আয়তক্ষেত্রাকার আকারযুক্ত বস্তুর জন্য এখানে একটি ইন্টারফেস রয়েছে:

interface IRectangular
{
    Int32 Width();
    Int32 Height();
}

এটির জন্য যা দাবি করা হয় তা হল আপনি অবজেক্টের প্রস্থ এবং উচ্চতা অ্যাক্সেস করার উপায়গুলি বাস্তবায়ন করুন।

এখন আসুন এমন একটি পদ্ধতি নির্ধারণ করুন যা যে কোনও অবজেক্টে কাজ করবে IRectangular:

static class Utils
{
    public static Int32 Area(IRectangular rect)
    {
        return rect.Width() * rect.Height();
    }
}

এটি যে কোনও আয়তক্ষেত্রাকার বস্তুর ক্ষেত্রটি ফিরিয়ে দেবে।

আসুন একটি শ্রেণি SwimmingPoolযা আয়তক্ষেত্রাকার বাস্তবায়ন করি :

class SwimmingPool : IRectangular
{
    int width;
    int height;

    public SwimmingPool(int w, int h)
    { width = w; height = h; }

    public int Width() { return width; }
    public int Height() { return height; }
}

এবং অন্য শ্রেণি Houseযা আয়তক্ষেত্রাকার:

class House : IRectangular
{
    int width;
    int height;

    public House(int w, int h)
    { width = w; height = h; }

    public int Width() { return width; }
    public int Height() { return height; }
}

এটি প্রদত্ত, আপনি Areaঘর বা সুইমিং-পুলগুলিতে পদ্ধতিটি কল করতে পারেন :

var house = new House(2, 3);

var pool = new SwimmingPool(3, 4);

Console.WriteLine(Utils.Area(house));
Console.WriteLine(Utils.Area(pool));

এইভাবে, আপনার শ্রেণিগুলি যে কোনও সংখ্যক ইন্টারফেস থেকে আচরণ "স্থিতিশীল" করতে পারে।


3

একটি ইন্টারফেস একটি নির্দিষ্ট কার্যকারিতা সরবরাহকারী এবং সংশ্লিষ্ট গ্রাহকদের মধ্যে একটি চুক্তি সংজ্ঞায়িত করে। এটি চুক্তি (ইন্টারফেস) থেকে বাস্তবায়নটিকে decouples করে। আপনার অবজেক্ট ওরিয়েন্টেড আর্কিটেকচার এবং ডিজাইনের দিকে নজর দেওয়া উচিত। আপনি উইকিপিডিয়া দিয়ে শুরু করতে চাইতে পারেন: http://en.wikedia.org/wiki/Interface_( কমপিটিং)


3

কি ?

ইন্টারফেস মূলত একটি চুক্তি যা সমস্ত শ্রেণি প্রয়োগ করে ইন্টারফেস অনুসরণ করা উচিত। এগুলি একটি শ্রেণীর মতো দেখাচ্ছে তবে তাদের কোনও প্রয়োগ নেই।

ইন C#ইন্টারফেস কনভেনশন দ্বারা নাম prefixing একটি 'আমি' তাই যদি আপনি একটি ইন্টারফেস আকার নামের করতে চাই, যদি আপনি শব্দটি ঘোষণা করা হবে দ্বারা সংজ্ঞায়িত করা হয়IShapes

এখন কেন?

Improves code re-usability

বলুন যে আপনি আঁকতে চান Circle, Triangle. আপনি তাদের একসাথে দলবদ্ধ করতে পারেন এবং তাদের কল করতে Shapesপারেন এবং আঁকার বিভিন্ন পদ্ধতি থাকতে পারেন Circleএবং Triangle তবে কংক্রিটের বাস্তবায়ন করা একটি খারাপ ধারণা হবে কারণ আগামীকাল আপনি আরও 2 Shapes Rectangle& থাকবেন বলে সিদ্ধান্ত নিতে পারেন Square। এখন আপনি এগুলি যুক্ত করার একটি দুর্দান্ত সুযোগ রয়েছে যে আপনি আপনার কোডের অন্যান্য অংশগুলি ভেঙে ফেলতে পারেন।

ইন্টারফেসের সাহায্যে আপনি চুক্তি থেকে আলাদা বাস্তবায়ন পৃথক করে দিন


সরাসরি পরিস্থিতি দিন 1

আপনাকে চেনাশোনা এবং ত্রিভুজ আঁকার জন্য একটি অ্যাপ তৈরি করতে বলা হয়েছিল

interface IShapes
{
   void DrawShape();
   
 }

class Circle : IShapes
{
    
    public void DrawShape()
    {
        Console.WriteLine("Implementation to Draw a Circle");
    }
}

Class Triangle: IShapes
{
     public void DrawShape()
    {
        Console.WriteLine("Implementation to draw a Triangle");
    }
}
static void Main()
{
     List <IShapes> shapes = new List<IShapes>();
        shapes.Add(new Circle());
        shapes.Add(new Triangle());

        foreach(var shape in shapes)
        {
            shape.DrawShape();
        }
}

লাইভ সিনারিও ডে 2

যদি আপনাকে এটিতে যুক্ত করতে Squareএবং Rectangleএটিতে জিজ্ঞাসা করা হয়, আপনাকে যা করতে হবে তা হ'ল তালিকার মধ্যে class Square: IShapesএবং Mainযুক্ত করার জন্য এটি তৈরি করতে হবেshapes.Add(new Square());


আপনি কয়েক বছরের অন্যান্য উত্তর কয়েক শতাধিক উত্তর দিয়ে year বছরের পুরানো প্রশ্নের উত্তর যুক্ত করছেন কেন? এখানে এমন কিছুই নেই যা ইতিমধ্যে বলা হয়নি।
জোনাথন রাইনহার্ট

@ জোনাথনরাইনহার্ট, হ্যাঁ, আমিও তাই ভেবেছিলাম, তবে তখন আমি এই উদাহরণটি ভাবছিলাম এবং এর ব্যাখ্যাটি যেভাবে দেহের সাথে সম্পর্কিত তা অন্যের চেয়ে ভালভাবে সহায়তা করবে।
ক্লিন্ট

2

এখানে অনেক ভাল উত্তর আছে তবে আমি কিছুটা ভিন্ন দৃষ্টিকোণ থেকে চেষ্টা করতে চাই।

আপনি অবজেক্ট ওরিয়েন্টেড ডিজাইনের সলাইড নীতিগুলির সাথে পরিচিত হতে পারেন। সংক্ষেপে:

এস - একক দায়িত্বের নীতিমালা ও - ওপেন / ক্লোজড প্রিন্সিপাল এল - লিসকভ সাবস্টিটিউশন নীতি আই - ইন্টারফেস বিভাজন নীতি ডি - নির্ভরতা বিপরীতমুখী মূলনীতি

সলিড নীতি অনুসরণ করে এমন কোড তৈরি করতে সাহায্য করে যা পরিষ্কার, ভাল ফ্যাক্টরড, সম্মিলিত এবং আলগাভাবে মিলিত হয়। দেত্তয়া আছে:

"প্রতিটি স্কেল সফ্টওয়্যার এর উপর নির্ভরতা পরিচালনই মূল চ্যালেঞ্জ" (ডোনাল্ড নুথ)

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

ইন্টারফেসগুলি বিশেষত নির্ভরতা বিপরীতমুখী মূলনীতিতে সহায়তা করে যেখানে কোডগুলি পরিষেবাগুলির সংকলনে সংযুক্ত করা যায়, প্রতিটি পরিষেবা একটি ইন্টারফেস দ্বারা বর্ণিত হয়। তারপরে পরিষেবাগুলি কনস্ট্রাক্টর প্যারামিটার হিসাবে পাস করে রানটাইমের সময় ক্লাসগুলিতে "ইনজেকশন" দেওয়া যেতে পারে। আপনি ইউনিট পরীক্ষা লিখতে এবং পরীক্ষা চালিত বিকাশ ব্যবহার করতে শুরু করলে এই কৌশলটি সত্যই সমালোচিত হয়ে ওঠে। চেষ্টা করে দেখুন! আপনি দ্রুত বুঝতে পারবেন কীভাবে ইন্টারফেসগুলি পৃথক পৃথকভাবে পৃথকভাবে পরীক্ষা করা যেতে পারে এমন ব্যবস্থাপনামূলক খণ্ডগুলিতে কোডটি ছিন্ন করতে সহায়তা করে।


1

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


1

সেখানে সত্যিই দুর্দান্ত উদাহরণ জিজ্ঞাসা করা হয়।

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

আপনার পিজ্জার উদাহরণে, যদি পিজ্জা বানাতে চান তবে ইন্টারফেসটি আপনার যা প্রয়োজন তা সেখান থেকে প্রতিটি পিজ্জা তার নিজস্ব যুক্তি দেখায়।

এটি কাপলিং এবং সাইক্লোমেটিক জটিলতা হ্রাস করতে সহায়তা করে। আপনাকে এখনও যুক্তিটি বাস্তবায়ন করতে হবে তবে বিস্তৃত ছবিতে আপনার নজর রাখতে হবে কম থাকবে।

প্রতিটি পিজ্জার জন্য আপনি সেই পিজ্জা সম্পর্কিত নির্দিষ্ট তথ্যের উপর নজর রাখতে পারেন। অন্যান্য পিজ্জার কী আছে তা বিবেচ্য নয় কারণ কেবল অন্যান্য পিজ্জাগুলিই জানতে হবে।


1

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

  1. ক্লাস সিসি ক্লাস সি এর যে কোনও পাবলিক বা সুরক্ষিত সদস্যকে নিজের নিজস্ব হিসাবে ব্যবহার করতে পারে এবং সুতরাং কেবল পিতামাতা শ্রেণীর অস্তিত্ব নেই এমন জিনিসগুলি প্রয়োগ করতে হবে।
  2. সিসির একটি রেফারেন্স পাস করা বা একটি রুটিন বা ভেরিয়েবলের কাছে বরাদ্দ করা যেতে পারে যা কোনও সি এর রেফারেন্স আশা করে

উত্তরাধিকারের এই দুটি কার্য কোনও অর্থে স্বাধীন; যদিও উত্তরাধিকার একই সাথে উভয় ক্ষেত্রেই প্রযোজ্য, প্রথমটি ছাড়া দ্বিতীয়টি প্রয়োগ করাও সম্ভব। এটি কার্যকর কারণ একটি জিনিসকে এক বা একাধিক প্রকারের পরিবর্তে পরিবর্তন করার অনুমতি দেওয়ার চেয়ে দুটি বা আরও বেশি সম্পর্কিত সম্পর্কযুক্ত শ্রেণি থেকে সদস্যদের উত্তরাধিকারী হওয়ার অনুমতি দেওয়া আরও জটিল।

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

এটির একটি দুর্দান্ত বৈশিষ্ট্য (। নেট ফ্রেমওয়ার্ক, আইএমএইচও-তে নিরূপিত) হ'ল তারা কোনও বস্তু কী করতে পারে তা ঘোষণামূলকভাবে নির্দেশিত করে তোলে। উদাহরণস্বরূপ, কিছু অবজেক্ট ডেটা-সোর্স অবজেক্ট চাইবে যেখান থেকে তারা সূচি অনুসারে জিনিসগুলি পুনরুদ্ধার করতে পারে (একটি তালিকার সাহায্যে সম্ভব) তবে তাদের সেখানে কোনও সঞ্চয় করার প্রয়োজন হবে না। অন্যান্য রুটিনগুলির জন্য ডেটা-ডিপোজিটরি অবজেক্টের প্রয়োজন হবে যেখানে তারা সূচি দ্বারা জিনিসগুলি সংগ্রহ করতে পারে (সংগ্রহ হিসাবে যুক্ত করুন) তবে তাদের আর কিছুই পড়ার দরকার পড়বে না। কিছু ডেটা ধরণের সূচি অনুসারে অ্যাক্সেসের অনুমতি দেবে, তবে লেখার অনুমতি দেবে না; অন্যরা লেখার অনুমতি দেবে, তবে সূচকের মাধ্যমে অ্যাক্সেসের অনুমতি দেবে না। কিছু অবশ্যই উভয়কে অনুমতি দেবে।

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


1

ইন্টারফেসগুলি আরও একটি ইন্টারফেস তৈরি করতে ডেইজি চেইনযুক্ত হতে পারে। একাধিক ইন্টারফেস বাস্তবায়নের এই ক্ষমতা বিকাশকারীকে বর্তমান শ্রেণীর কার্যকারিতা পরিবর্তন না করে তাদের ক্লাসে কার্যকারিতা যুক্ত করার সুবিধা দেয় (সোলিড নীতিগুলি)

ও = "ক্লাসগুলি এক্সটেনশনের জন্য উন্মুক্ত হওয়া উচিত তবে পরিবর্তনের জন্য বন্ধ করা উচিত"


1

আমার কাছে একটি ইন্টারফেসের সুবিধা / সুবিধা হ'ল এটি একটি বিমূর্ত শ্রেণীর চেয়ে আরও নমনীয়। যেহেতু আপনি কেবলমাত্র 1 টি বিমূর্ত শ্রেণীর উত্তরাধিকারী হতে পারেন তবে আপনি একাধিক ইন্টারফেস প্রয়োগ করতে পারেন, অনেক জায়গায় একটি বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত কোনও সিস্টেমে পরিবর্তন সমস্যাযুক্ত হয়ে ওঠে। যদি এটি 100 জায়গায় উত্তরাধিকার সূত্রে প্রাপ্ত হয়, তবে পরিবর্তনের জন্য সমস্ত 100 টিতে পরিবর্তন দরকার হয় But অতিরিক্ত হিসাবে, মেমরির ব্যবহারটি মনে হচ্ছে এটি ইন্টারফেসের সাথে কম হবে কারণ ইন্টারফেসের উদাহরণে কোনও বস্তু ইন্টারফেসটি কতগুলি স্থানে প্রয়োগ করেও মেমরিতে মাত্র একবার ব্যবহার করা হয়।


1

ইন্টারফেসগুলি ধারাবাহিকতা চালানোর জন্য ব্যবহার করা হয়, এমনভাবে যেভাবে আলগাভাবে মিলিত হয় যা বিমূর্ত শ্রেণীর সাথে পৃথক করে তোলে যা শক্তভাবে মিলিত হয় hat এ কারণেই এটি সাধারণত চুক্তি হিসাবেও সংজ্ঞায়িত হয় the ইন্টারফেস প্রয়োগকারী যে ক্লাসগুলি "নিয়ম / বাক্য গঠন" মেনে চলে ইন্টারফেস দ্বারা সংজ্ঞায়িত এবং এর মধ্যে কোন কংক্রিট উপাদান নেই।

আমি কেবল নীচের গ্রাফিক দ্বারা সমর্থিত একটি উদাহরণ দেব।

কোনও কারখানায় কল্পনা করুন যে এখানে 3 ধরণের মেশিন রয়েছে A একটি আয়তক্ষেত্র মেশিন, একটি ত্রিভুজ মেশিন এবং বহুভুজ মেশিন ime সময় প্রতিযোগিতামূলক এবং আপনি অপারেটর প্রশিক্ষণ প্রবাহিত করতে চান You আপনি কেবল মেশিনগুলি শুরু এবং বন্ধ করার একটি পদ্ধতিতে তাদের প্রশিক্ষণ দিতে চান যাতে আপনি একটি গ্রিন স্টার্ট বোতাম এবং লাল স্টপ বোতাম রয়েছে now এখন 3 টি বিভিন্ন মেশিন জুড়ে আপনার কাছে 3 টি বিভিন্ন ধরণের মেশিন শুরু করার এবং বন্ধ করার একটি ধারাবাহিক পদ্ধতি রয়েছে imagine এখন কল্পনা করুন এই মেশিনগুলি ক্লাস এবং ক্লাসগুলি শুরু এবং বন্ধ করার পদ্ধতিগুলি থাকা দরকার, আপনি কীভাবে এই ক্লাসগুলি জুড়ে ধারাবাহিকতা চালনা যা খুব আলাদা হতে পারে? ইন্টারফেস এর উত্তর।

এখানে চিত্র বর্ণনা লিখুন

আপনাকে কল্পনা করতে সহায়তা করার একটি সাধারণ উদাহরণ, কেউ জিজ্ঞাসা করতে পারেন কেন বিমূর্ত শ্রেণি ব্যবহার করবেন না? একটি ইন্টারফেসের সাহায্যে অবজেক্টগুলি সরাসরি সম্পর্কিত বা উত্তরাধিকার সূত্রে প্রাপ্ত হতে হবে না এবং আপনি এখনও বিভিন্ন শ্রেণীর মধ্যে ধারাবাহিকতা চালনা করতে পারেন।

public interface IMachine
{
    bool Start();
    bool Stop();
}

public class Car : IMachine
{
    public bool Start()
    {
        Console.WriteLine("Car started");
        return true;
    }

    public bool Stop()
    {
        Console.WriteLine("Car stopped");
        return false;
    }
}

public class Tank : IMachine
{
    public bool Start()
    {
        Console.WriteLine("Tank started");
        return true;
    }

    public bool Stop()
    {
        Console.WriteLine("Tank stopped");
        return false;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var car = new Car();
        car.Start();
        car.Stop();

        var tank = new Tank();
        tank.Start();
        tank.Stop();

    }
}

1
class Program {
    static void Main(string[] args) {
        IMachine machine = new Machine();
        machine.Run();
        Console.ReadKey();
    }

}

class Machine : IMachine {
    private void Run() {
        Console.WriteLine("Running...");
    }
    void IMachine.Run() => Run();
}

interface IMachine
{
    void Run();
}

আমি এটি একটি ভিন্ন দৃষ্টিকোণ দ্বারা বর্ণনা করি। আসুন আমি উপরের উদাহরণটি অনুসারে একটি গল্প তৈরি করি;

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

এবং প্রোগ্রামটি ইমচাইনের সাহায্যে কীভাবে চালানো যায় তা শিখেছে।

ইন্টারফেস যোগাযোগ এবং আলগাভাবে যুগল প্রকল্পগুলির বিকাশ সরবরাহ করে।

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


1

আমি জানি আমি খুব দেরীতে হয়েছি .. (প্রায় নয় বছর), তবে কেউ যদি ছোট ব্যাখ্যা চান তবে আপনি এটির জন্য যেতে পারেন:

সহজ কথায়, আপনি ইন্টারফেসটি ব্যবহার করেন যখন আপনি জানেন যে কোনও অবজেক্ট কী করতে পারে বা কোন ফাংশনটি আমরা কোন বস্তুর উপর প্রয়োগ করতে চলেছি .. উদাহরণস্বরূপ সন্নিবেশ, আপডেট এবং মুছুন।

interface ICRUD{
      void InsertData(); // will insert data
      void UpdateData(); // will update data
      void DeleteData(); // will delete data
}

গুরুত্বপূর্ণ দ্রষ্টব্য: ইন্টারফেসগুলি সর্বদা সর্বজনীন।

আশাকরি এটা সাহায্য করবে.

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