একটি ইন্টারফেস এবং একটি শ্রেণীর মধ্যে পার্থক্য কী এবং আমি যখন ক্লাসে পদ্ধতিগুলি সরাসরি প্রয়োগ করতে পারি তখন কেন আমার একটি ইন্টারফেস ব্যবহার করা উচিত?


117

আমি সচেতন যে এটি একটি খুব প্রাথমিক প্রশ্ন, কিন্তু একজন সাক্ষাত্কারকারী আমাকে খুব কৌশল করে জিজ্ঞাসা করেছিলেন এবং আমি অসহায় :(

আমি কেবলমাত্র একটি ইন্টারফেসের জন্য উপাদান বা তাত্ত্বিক সংজ্ঞা জানি এবং এটিতে কাজ করেছি এমন অনেক প্রকল্পে এটি প্রয়োগ করে। তবে কেন এবং কীভাবে এটি দরকারী তা আমি সত্যিই বুঝতে পারি না।

আমি ইন্টারফেসে একটি জিনিসও বুঝতে পারি না। উদাহরণস্বরূপ, আমরা ব্যবহার করি

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

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

সাক্ষাত্কারকারী বলেছেন:

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

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


4
ইন্টারফেসগুলি এমন একটি যা আমি বুঝতেও संघर्ष করেছি। ভাল প্রশ্ন.
ব্রায়ান

4
একটি কংক্রিট বাস্তবায়নের পরিবর্তে একটি বিমূর্ত চুক্তিতে প্রোগ্রামিং .... সংক্ষেপে, এর অর্থ হল আপনি যখন কোনও ইন্টারফেসের প্রয়োজন হয় তখন কোনও ইন্টারফেস প্রয়োগ করে এমন কোনও বস্তু প্রতিস্থাপন করতে পারবেন।
মিচ গম

7
SqlConnectionউত্তরাধিকারসূত্রে System.ComponentModel.Componentযা প্রয়োগ করে IDisposable
লি

2
@ মিচওয়েট - এটি উদাহরণ হিসাবে বোঝানো নয়, প্রশ্নটি কীভাবে SqlConnectionপ্রয়োগ করে তা জিজ্ঞাসা করে IDisposable
লি

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

উত্তর:


92

ইন্টারফেসগুলি দুর্দান্ত যখন আপনি এটির মতো কিছু তৈরি করতে চান:

using System;

namespace MyInterfaceExample
{
    public interface IMyLogInterface
    {
        //I want to have a specific method that I'll use in MyLogClass
        void WriteLog();       
    }

    public class MyClass : IMyLogInterface
    {

        public void WriteLog()
        {
            Console.Write("MyClass was Logged");
        }
    }

    public class MyOtherClass : IMyLogInterface
    {

        public void WriteLog()
        {
            Console.Write("MyOtherClass was Logged");
            Console.Write("And I Logged it different, than MyClass");
        }
    }

    public class MyLogClass
    {
        //I created a WriteLog method where I can pass as a parameter any object that implements IMyLogInterface.
        public static void WriteLog(IMyLogInterface myLogObject)
        {
            myLogObject.WriteLog(); //So I can use WriteLog here.
        }
    }

    public class MyMainClass
    {
        public void DoSomething()
        {
            MyClass aClass = new MyClass();
            MyOtherClass otherClass = new MyOtherClass();

            MyLogClass.WriteLog(aClass);//MyClass can log, and have his own implementation
            MyLogClass.WriteLog(otherClass); //As MyOtherClass also have his own implementation on how to log.
        }
    }
}

আমার উদাহরণে, আমি এমন একজন বিকাশকারী হতে পারি যিনি লেখেন MyLogClassএবং অন্য বিকাশকারীরা তাদের ক্লাস তৈরি করতে পারতেন এবং তারা লগ করতে চাইলে তারা ইন্টারফেসটি বাস্তবায়ন করে IMyLogInterface। তারা আমাকে জিজ্ঞাসা করছিল যে WriteLog()পদ্ধতিটি ব্যবহারের জন্য তাদের কী প্রয়োগ করতে হবে MyLogClass। উত্তরটি তারা ইন্টারফেসে পাবেন।


3
আরে এটি দেখতে আমার জন্য খুব ভাল উপাদানটির মতো দেখায়, আমি সত্যিই এটির প্রশংসা করি, অনেক ধন্যবাদ :) :)
শিক্ষার্থী

14
আমার প্রশ্ন হ'ল আপনি যদি তাত্ক্ষণিক কাজ করছেন MyClassএবং MyOtherClassকেন আপনি কেবল aClass.WriteLog()সেই অতিরিক্ত পদক্ষেপটি যুক্ত করবেন তা কল করবেন না । WriteLog()প্রতিটি ক্লাসের বাস্তবায়ন আলাদা থাকবে তবে আপনার ইতিমধ্যে অবজেক্ট রয়েছে তাই কেন এটি হ্যান্ডলার শ্রেণিতে পাস করবেন?
জাচ এম।

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

2
@ZachM। যদি আমি সঠিক, উত্তরটির অর্থ হ'ল তিনি ক্লাসগুলি ইনস্ট্যান্ট করবেন না, তবে অন্যান্য বিকাশকারীরা ক্লাসগুলি ইনস্ট্যান্ট করবেন এবং MyLogClass WriteLogপদ্ধতিতে প্যারামিটার হিসাবে পাস করবেন । সুতরাং তার পদ্ধতিটি কার্যকর করে এমন কোনও বস্তু পরিচালনা করতে পারে IMyLogInterfaceএখানে আরও একটি আকর্ষণীয় পোস্ট।
শাইজুট

1
আমার প্রশ্ন ইন্টারফেস কেন ??? উপরের দৃশ্যটি সমস্ত বিমূর্ত পদ্ধতি সহ একটি বিমূর্ত শ্রেণি দ্বারাও অর্জন করা যেতে পারে।
অভিজিৎ ওঝা

52

আমি ইন্টারফেস ব্যবহার করার একটি কারণ হ'ল এটি কোডের নমনীয়তা বৃদ্ধি করে। ধরা যাক আমরা এমন একটি পদ্ধতি পেয়েছি যা ক্লাসের ধরণের অ্যাকাউন্টের পরামিতি হিসাবে অ্যাকাউন্ট গ্রহণ করে, যেমন:

public void DoSomething(Account account) {
  // Do awesome stuff here.
}

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

public void DoSomething(IAccount account) {
  // Do awesome stuff here.
}

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


45

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

ইন্টারফেস কেন

  • আপনার ডিফল্ট বা ভাগ করা কোড বাস্তবায়ন নেই
  • আপনি ডেটা চুক্তিগুলি ভাগ করতে চান (ওয়েব পরিষেবাদি, এসওএ)
  • প্রতিটি ইন্টারফেস প্রয়োগকারী জন্য আপনার পৃথক প্রয়োগ IDbCommandরয়েছেSqlCommandOracleCommand ( নির্দিষ্ট উপায়ে ইন্টারফেস প্রয়োগ করে এবং আছে )
  • আপনি একাধিক উত্তরাধিকার সমর্থন করতে চান ।

কেন অ্যাবস্ট্রাক্ট

  • আপনার ডিফল্ট বা ভাগ করা কোড প্রয়োগ রয়েছে
  • আপনি কোড সদৃশকে ছোট করতে চান
  • আপনি সহজেই সংস্করণ সমর্থন করতে চান

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

1
ইন্টারফেসগুলি ও এসওএ যুগ্মভাবে সম্বন্ধে একটি ব্যবহারিক উদাহরণস্বরূপ, আমরা আমাদের WCF ইন্টারফেস ভাগ ( DataContractsএকটি .NET পরিষদের (IN) যেমন Contracts.Shared.dll ) যাতে .NET ক্লায়েন্ট ভোক্তাদের সহজে করতে পারেন তোলার বিষয়ে ব্যবহারChannelFactory ( যোগ করুন পরিষেবা রেফারেন্স ইত্যাদির মাধ্যমে উৎপাদিত কোড এড়ানো ) বা ভাগ করা প্রকারের সাথে পরিষেবা রেফারেন্স যুক্ত করুন
স্লিভারনিজা - এমএসএফটি

যদি, আমি একটি বিমূর্ত Calss এর মধ্যে কেবল বিমূর্ত পদ্ধতি ঘোষণা করব, তবে বিমূর্ত শ্রেণিটি ইন্টারফেস হিসাবে কাজ করবে, তবে আমাদের ইন্টারফেসের প্রয়োজন কেন?
অভিজিৎ ওঝা

25

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

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

ইন্টারফেসগুলি কার্যকর কারণ তারা এমন চুক্তি প্রদান করে যা বস্তুগুলি একে অপরের সম্পর্কে অন্য কিছু জানার দরকার না করে একসাথে কাজ করতে পারে।


এটি উপলব্ধি করে, তবে আমি এখনও বুঝতে লড়াই করছি, আপনি কি পাওয়ারসকেটের জন্য বেস ক্লাস তৈরি করতে পারবেন না এবং প্রয়োজনে এই সমস্ত জিনিস এর উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে। প্রযুক্তিগতভাবে পাওয়ার সকেটগুলির অন্যান্য শ্রেণি সম্পর্কে কোনও ধারণা নেই।
altaaf.hussin

আমি মনে করি কারণ সি # তে একাধিক উত্তরাধিকার অনুমোদিত নয়
হিউ সিগ্রেভস

22

এক কথায় - বহুবর্ষের কারণে !

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

  • নির্ভরতা ইনজেকশনটি দেখুন এবং অবশ্যই ডিজাইন প্যাটার্নগুলি পড়ুন - জিওএফ দ্বারা পুনঃব্যবহারযোগ্য অবজেক্ট-ওরিয়েন্টড সফ্টওয়্যার এর উপাদানসমূহ

4

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


3
আপনি ডায়নামিক টাইপের সাথে। নেট 4 এ ধরণের ডাকটিপিং পেতে পারেন।
টনি হপকিনসন

4

আমি বিশ্বাস করি যে এই প্রশ্ন জিজ্ঞাসা করে ইতিমধ্যে অনেক রক্ত ​​ছড়িয়ে পড়েছিল এবং অনেকে রোবোটের মতো পদগুলি ব্যাখ্যা করে যা কোনও সাধারণ মানুষ বুঝতে পারে না সেগুলি ব্যাখ্যা করে এই সমস্যাগুলি সমাধান করার চেষ্টা করে।

তাই প্রথম. কেন ইন্টারফেস এবং কেন বিমূর্ত আপনাকে সেগুলির জন্য কী তা শিখতে হবে learn কারখানা ক্লাস প্রয়োগ করার সময় আমি ব্যক্তিলি এই দুটি শিখেছি। আপনি এই লিঙ্কে একটি ভাল টিউটোরিয়াল খুঁজে

এখন আসুন আমি ইতিমধ্যে যে লিঙ্কটি দিয়েছি তার ভিত্তিতে ডিগ-ইন করি।

আপনার কাছে যানবাহন শ্রেণি রয়েছে যা ব্যবহারকারীর প্রয়োজন অনুসারে পরিবর্তিত হতে পারে (যেমন ট্রাক , ট্যাঙ্ক , বিমান ইত্যাদি যোগ করা এবং আমাদের দেওয়া রয়েছে

public class clsBike:IChoice
{
   #region IChoice Members
    public string Buy()
    {
       return ("You choose Bike");
    }
    #endregion
}

এবং

public class clsCar:IChoice
{
   #region IChoice Members
    public string Buy()
    {
       return ("You choose Car");
    }
    #endregion
}

এবং উভয়ের কাছে কন্ট্রাক্ট আইসিওয়েস রয়েছে যা কেবল আমার ক্লাসে কেনার পদ্ধতি থাকা উচিত

public interface IChoice
{
    string Buy();
}

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

public abstract class Choice
{
    public abstract string Discount { get; }
    public abstract string Type { get; }
    public string Buy()
    {
       return "You buy" + Type + " with " + Discount;
}
public class clsBike: Choice
{
    public abstract string Discount { get { return "10% Discount Off"; } }
    public abstract string Type { get { return "Bike"; } }
}

public class clsCar:Choice
{
    public abstract string Discount { get { return " $15K Less"; } }
    public abstract string Type { get { return "Car"; } }
}

এখন কারখানা ক্লাস ব্যবহার করে আপনি একই জিনিস অর্জন করতে পারেন তবে বিমূর্ত ব্যবহার করে আপনি বেস ক্লাসটি Buy()পদ্ধতিটি কার্যকর করতে দিন ।

সংক্ষিপ্তসার: ইন্টারফেস চুক্তি উত্তরাধিকারী বর্গকে বাস্তবায়ন করতে দেয় যখন বিমূর্ত শ্রেণি চুক্তিগুলি বাস্তবায়ন শুরু করতে পারে (যা উত্তরাধিকারী শ্রেণীর দ্বারা ওভাররাইড করতে পারে)


2

একটি ইন্টারফেসের মাধ্যমে আপনি নিম্নলিখিতটি করতে পারেন:

1) বিভাজনযুক্ত ইন্টারফেস তৈরি করুন যা আপনার বাস্তবায়নের বিবিধ কাট সরবরাহ করে, আরও সংঘবদ্ধ ইন্টারফেসের জন্য অনুমতি দেয়।

2) ইন্টারফেসের মধ্যে একই নামের একাধিক পদ্ধতির অনুমতি দিন, কারণ ওহে, আপনার কোনও বিরোধী বাস্তবায়ন নেই, কেবল একটি স্বাক্ষর।

3) আপনি কোনও চুক্তি পূরণের বিষয়টি নিশ্চিত করে আপনার প্রয়োগের স্বতন্ত্রভাবে আপনার ইন্টারফেসটি সংস্করণে এবং আমবাত করতে পারেন।

৪) আপনার কোডটি সংক্ষিপ্তকরণের পরিবর্তে বিমূর্তির উপর নির্ভর করতে পারে, ইনজেকশন টেস্ট মকস সহ স্মার্ট নির্ভরতা ইনজেকশনকে মঞ্জুরি দেয় etc.

আমি নিশ্চিত আরও অনেক কারণ রয়েছে, এগুলি কয়েকটি মাত্র।

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


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

2

@ ব্যবহারকারী2211290 উত্তরের আসল নমুনা হিসাবে:

উভয় Arrayএবং Listইন্টারফেস আছে IList। নীচে আমাদের কাছে একটি string[]এবং একটি রয়েছে List<string>এবং IList ব্যবহার করে উভয়কে একটি পদ্ধতিতে পরীক্ষা করে দেখুন :

string[] col1 = { "zero", "one", "two", "three", "four"};
List<string> col2 = new List<string>{ "zero", "one", "two", "three"};

//a methode that manipulates both of our collections with IList
static void CheckForDigit(IList collection, string digit)
{
    Console.Write(collection.Contains(digit));
    Console.Write("----");
    Console.WriteLine(collection.ToString()); //writes the type of collection
}

static void Main()
{
    CheckForDigit(col1, "one");   //True----System.String[]
    CheckForDigit(col2, "one");   //True----System.Collections.Generic.List`1[System.String]



//Another test:

    CheckForDigit(col1, "four");   //True----System.String[]
    CheckForDigit(col2, "four");   //false----System.Collections.Generic.List`1[System.String]
}

1

আপনি কেবল একটি বিমূর্ত ক্লাস থেকে উত্তরাধিকারী হতে পারেন। আপনি একাধিক ইন্টারফেস থেকে উত্তরাধিকারী হতে পারে। এটি বেশিরভাগ ক্ষেত্রে আমি কী ব্যবহার করি তা নির্ধারণ করে।

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


1

বিমূর্ত শ্রেণি এবং ইন্টারফেস উভয়ই চুক্তি।

একটি চুক্তির ধারণা আপনি কিছু আচরণ নির্দিষ্ট করে specify যদি আপনি বলেন যে আপনি প্রয়োগ করেছেন আপনি চুক্তিতে সম্মত হয়েছেন।

ইন্টারফেসের উপর বিমূর্তের পছন্দটি।

বিমূর্ত শ্রেণীর কোনও অ-বিমূর্ত বংশধর চুক্তিটি কার্যকর করবেন।

বনাম

ইন্টারফেস প্রয়োগ করে এমন কোনও শ্রেণি চুক্তিটি বাস্তবায়ন করবে।

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


1

ইন্টারফেসগুলি বাস্তবের বিমূর্ততা (শ্রেণিগুলি) (অবজেক্টস) এর বিমূর্ততা (একটি ধনুপ্রদর্শন) তৈরি করতে হয়।

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

ইন্টারফেসগুলি নির্দিষ্টকরণ:

  • ইন্টারফেসগুলি হ'ল একা এবং স্থিতিশীল হওয়ায় ধারণাটির অস্থায়ী আচরণ নির্দিষ্ট করার জন্য নকশার সময় শৈলীর নকশাগুলি।

  • শ্রেণিগুলি বাস্তবতার মোবাইল কাঠামোটিকে মিথস্ক্রিয়া করে এবং চালনা করে সে হিসাবে নির্দিষ্ট করার জন্য বাস্তবায়ন সময়ের শিল্পকর্মগুলি।

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

আপনি যখন একটি বিড়াল পর্যবেক্ষণ করেন তখন আপনি বলতে পারেন যে এটি এমন একটি প্রাণী যার চার পাঞ্জা, একটি মাথা, একটি কাণ্ড, একটি লেজ এবং চুল রয়েছে। আপনি দেখতে পাচ্ছেন যে সে হাঁটতে, দৌড়াতে, খেতে এবং মায়ো করতে পারে। ইত্যাদি।

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

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

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

বুঝতে পেরে আমরা পাস্কেল অবজেক্ট কোডিংকে উল্লেখ করতে পারি যেখানে আপনি একটি ইউনিটে ইন্টারফেস এবং বাস্তবায়ন বিভাগগুলিতে সংজ্ঞা দেন। ইন্টারফেসে আপনি প্রকারগুলি সংজ্ঞায়িত করেন এবং প্রয়োগের ক্ষেত্রে আপনি টাইপটি প্রয়োগ করেন:

unit UnitName;

interface

type
  TheClass = class
  public
    procedure TheMethod;
  end;

implementation

class procedure TheClass.TheMethod;
begin
end;

এখানে, ইন্টারফেস বিভাগটি ইউএমএল শ্রেণির নকশার সাথে মেলে তবে ইন্টারফেসের ধরণগুলি অন্য জিনিস।

সুতরাং আমাদের ব্যবসায়ের ক্ষেত্রে দুটি স্বতন্ত্র তবে অনুরূপ জিনিসকে মনোনীত করার জন্য আমাদের একটি শব্দ, ইন্টারফেস রয়েছে এবং এটি বিভ্রান্তির উত্স।

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

সর্বোপরি, ইন্টারফেসগুলি (বিতরণকৃত) কমনীয় অবজেক্ট মডেলের সাথে পরিচিত মেমরির মধ্যে বস্তুগুলির প্রয়োগ ও পরিচালনা সম্পর্কে চিন্তা না করেই বেমানান সিস্টেমগুলিকে যোগাযোগের অনুমতি দেওয়ার জন্য প্রয়োজনীয়।

ক্লাস কি?

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

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

যেমনটি, একটি বিমূর্ত শ্রেণিটি কোনওভাবেই সংকলকের দৃষ্টিকোণ থেকে একটি ইন্টারফেসের সমতুল্য।

অধিক তথ্য

প্রোটোকল (অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং)

সি # - ইন্টারফেস

সি # - ক্লাস


1

আমি আপনাকে উড়ন্ত টোস্টার সম্পর্কে বলি।

উড়ন্ত টোস্টার

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

তারপরে আবার যেকোন সফ্টওয়্যার সিস্টেম অ্যাসেম্বলি ল্যাঙ্গুয়েজে বা মেশিন কোডে আরও ভাল প্রয়োগ করা যেতে পারে। আমরা বিমূর্তন প্রক্রিয়াটি ব্যবহার করার কারণ হ'ল তারা বিষয়গুলিকে আরও সহজ করার ঝোঁক। ইন্টারফেসগুলি এমন একটি বিমূর্ত প্রক্রিয়া।

সুতরাং, এটি ঠিক তাই ঘটে যে কিছু অ-তুচ্ছ বস্তু-ভিত্তিক নকশাগুলি রয়েছে যা প্রয়োগ করা এত সহজ যে আপনি যদি ইন্টারফেস ব্যবহার করেন, সেই ক্ষেত্রে ইন্টারফেসগুলি ব্যবহারিকভাবে প্রয়োজনীয় হয়ে ওঠে।

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

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

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

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

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


0

ইন্টারফেসগুলি ক্লাস ডিজাইনারকে শেষ ব্যবহারকারীর জন্য উপলব্ধ পদ্ধতিগুলি খুব স্পষ্ট করে তুলতে দেয়। এগুলি পলিমারফিজমের একটি অবিচ্ছেদ্য অঙ্গ।


আপনার 1 ম বিবৃতিতে ভাল বলেছেন। তবে আমি আপনার ২ য় বক্তব্য বুঝতে পারছি না, আপনি কি দয়া করে একটি বাস্তব সময়ের উদাহরণ দিয়ে বিস্তারিত বর্ণনা করতে পারেন?
শিক্ষার্থী

0

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

আপনি জানেন যে ইন্টারফেসের কোনও কোড থাকতে পারে না তাই ডিস-ভ্যানটেজটি বোঝার পক্ষে সহজ।

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

সুতরাং খুব সাধারণভাবে আপনাকে ইন্টারফেসগুলিতে অ্যাবস্ট্রাক্ট ক্লাসটি পছন্দ করতে হবে যখন আপনি ক্লায়েন্টকে কোনও কনস্ট্রাক্টর বা কোনও কোড সরবরাহ করতে হবে যা আপনার শ্রেণীর উত্তরাধিকারী / প্রসারিত করবে


-2

অ্যাবস্ট্রাক্ট বর্গ সম্পর্কিত সংস্থাগুলির জন্য ক্রেট করা হয় যেখানে ইন্টারফেস হিসাবে সম্পর্কহীন সংস্থাগুলির জন্য ব্যবহার করা যেতে পারে।

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

নীচের মত দেখতে হবে

   Interface             
   ____|____
  |        |
Animal   Human



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