ইন্টারফেস বনাম বিমূর্ত শ্রেণি (সাধারণ ওও)


1413

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

আমার অভিজ্ঞতা থেকে আমি মনে করি নিম্নলিখিতগুলি সত্য। যদি আমি একটি প্রধান পয়েন্ট মিস করছি তবে আমাকে জানান।

ইন্টারফেস:

একটি ইন্টারফেসে ঘোষিত প্রতিটি একক পদ্ধতি সাবক্লাসে প্রয়োগ করতে হবে। ইন্টারফেসে কেবল ইভেন্টস, ডেলিগেটস, প্রোপার্টি (সি #) এবং পদ্ধতিগুলি বিদ্যমান থাকতে পারে। একটি শ্রেণি একাধিক ইন্টারফেস প্রয়োগ করতে পারে।

বিমূর্ত শ্রেণি:

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

  1. এত কিছুর পরেও সাক্ষাত্কারকারী প্রশ্নটি নিয়ে এসেছিলেন "আপনার যদি কেবল বিমূর্ত পদ্ধতি সহ একটি অ্যাবস্ট্রাক্ট শ্রেণি থাকে তবে কীভাবে এটি একটি ইন্টারফেসের থেকে আলাদা হতে পারে?" আমি উত্তরটি জানতাম না তবে আমি মনে করি যে এটি অধিকার হিসাবে উপরে উল্লিখিত হয়েছে?

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

আরও দেখুন :


412
যদিও আমি মনে করি দুজনের মধ্যে পার্থক্যটি জানা জরুরী, তবে এটি একটি ভাল সাক্ষাত্কারের প্রশ্ন নয় im কাজ না হলে ওও বিষয়ের উপর একটি বই লিখছিল। আপনি d ডিং ব্যাট না খেয়ে কাজ করা ভাল।
অ্যালান

107
@ অ্যালান: আমি আসলে এটি একটি সাক্ষাত্কারের প্রশ্ন হিসাবে পছন্দ করি, তবে আমি এই সম্পর্কে কাউকে এইভাবে আঘাত করব না - আমি সম্ভবত এটি আরও পোস্ট করব "শ্রেণিবিন্যাসের সংজ্ঞা দেওয়ার সময় আপনি একটি বিমূর্ত বেস শ্রেণীর উপর কোনও ইন্টারফেসটি কোথায় বেছে নেবেন? ", বা অনুরূপ কিছু।
রিড কোপসি

11
হতে পারে তারা আরও নকশাকেন্দ্রিক উত্তরের পরে ছিল ... যদিও আপনার মতো আমিও এটি প্রযুক্তিগত প্রশ্ন হিসাবে বিবেচনা করতাম।
কার্টেনডগ

16
এখানে চমৎকার টেবুলার পার্থক্য: mindprod.com/jgloss/interfacevsabstract.html
রজত_আর

30
@ কেভ: I insisted you can't have a public variable inside an interface.আমি মনে করি ইন্টারফেসে পাবলিক ভেরিয়েবল থাকতে পারে। আসলে ইন্টারফেসের ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে সর্বজনীন এবং চূড়ান্ত হয়।
একজন শিক্ষানবিশ

উত্তর:


746

আপনার প্রশ্নটি এটি "জেনারেল ওও" এর পক্ষে নির্দেশিত হলেও, মনে হচ্ছে এটি এই শব্দগুলির নেট নেট ব্যবহারের দিকে মনোনিবেশ করছে।

নেট মধ্যে (জাভা জন্য অনুরূপ):

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

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

প্রকৃতপক্ষে, নন-ভার্চুয়াল ইন্টারফেস (এনভিআই) নামে পরিচিত একটি সি ++ প্রবাদ রয়েছে যেখানে সর্বজনীন পদ্ধতিগুলি হ'ল ভার্চুয়াল পদ্ধতিগুলি যা বেসরকারী ভার্চুয়াল পদ্ধতিগুলিতে 'নষ্ট' করে:


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

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

82
+1: আমি বাজি রাখতে ইচ্ছুক যে এই বানরগুলি সাক্ষাত্কারের হোস্ট করছে তারা বুঝতে পারে না যে অন্যান্য ভাষাও ওও ভিন্নভাবে প্রয়োগ করে।
অরবিটে

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

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

866

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

সমস্ত ইউএসএএফ পাইলটকে কিছু নির্দিষ্ট বিমান বাহিনী-বিধিবিধান অনুসরণ করতে হয় এবং সমস্ত সি -১৪১ (বা এফ -১ 16, বা টি -38) পাইলটরা 'ইউএসএএফ পাইলট। যে কেউ সেফটি অফিসার হতে পারেন। সুতরাং, সংক্ষেপে বলা:

  • পাইলট: বিমূর্ত শ্রেণি
  • সি -141 পাইলট: কংক্রিট বর্গ
  • আইএসএফটিআই অফিসার: ইন্টারফেস

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


87
আমি এই উপমাটি সত্যিই পছন্দ করি, এটি একটি সামান্য জটিল বিষয় ব্যাখ্যা করার জন্য একটি সাধারণ উদাহরণ ব্যবহার করে
কেভিন বোয়ারক্সক্স

13
জটিল ওও পরিভাষা বোঝার এটি সেরা উপায়। সংক্ষেপে সমস্ত তত্ত্ব তখনই মূল্যবান যখন আপনি ব্যবহারিকভাবে এটি ব্যবহার করতে পারবেন। আপনি rexample সত্যিই সহজ তারপর বিভিন্ন বুলেট পয়েন্ট (বেশিরভাগই মন তীক্ষ্ন পরিবর্তে শোষিত হচ্ছে!) উপলব্ধি @Jay হয়
বনাম

54
আমি এখনও কিছুটা বিভ্রান্ত। বলুন, আপনি এখন এফ -16 এবং টি -38 যোগ্যতা পেয়েছেন, সুতরাং এখন ক্লাস Jayএকাধিক ক্লাস (সি -141 পাইলট, এফ -16 পাইলট এবং টি -38 পাইলট) থেকে উত্তরাধিকারী হতে পারে না, তার অর্থ কি এর ক্লাসগুলি ইন্টারফেসে পরিণত হওয়া উচিত? ধন্যবাদ
অ্যালেক্স ওকরুশকো

37
প্রচুর লোক যথাযথভাবে অ্যালেক্সের মন্তব্যে একটি +1 দিয়েছে, কারণ এটি এই উদাহরণে কিছুটা দুর্বলতা প্রকাশ করে। প্রথমত, আমি বলব যে জে তার নিজস্ব শ্রেণীর চেয়ে সি -141 পাইলটের উদাহরণ হতে পারে। অতিরিক্ত হিসাবে, যেহেতু ইউএসএএফ-তে 99% সমস্ত পাইলট এক সময় কেবলমাত্র একটি বিমানের জন্য যোগ্য (এফসিএফ এবং পরীক্ষামূলকভাবে পাইলটরা উল্লেখযোগ্য ব্যতিক্রম) আমি একাধিক যোগ্যতা এবং কীভাবে এটি বাস্তবায়িত হতে পারে তা বিবেচনা করি নি। আমি যেমন একজন পাইলট সম্পর্কে জানি যে, 50 বছর আগে, একইসাথে 25 টি বিভিন্ন বিমানের যোগ্য ছিল, আমি মনে করি যে আমরা একাধিক উত্তরাধিকার কীভাবে ব্যবহার করতে চাই না তা উদাহরণ দিয়ে দেয়।
জে

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

221

আমি মনে করি তারা যে উত্তরটি সন্ধান করছে তা হ'ল মৌলিক বা ওপিপিএস দার্শনিক পার্থক্য।

বিমূর্ত শ্রেণীর উত্তরাধিকার ব্যবহৃত হয় যখন উত্পন্ন শ্রেণিটি বিমূর্ত শ্রেণির মূল বৈশিষ্ট্য এবং আচরণ ভাগ করে নেয়। যে ধরণের আচরণ প্রকৃতপক্ষে শ্রেণীর সংজ্ঞা দেয়।

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

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


32
আমি মনে করি এর থেকে আরও ভাল উপমাটি "ইউজস ফুয়েল" হবে যা ইন্টারফেসের চুক্তির প্রকৃতিটি দেখায় ।
পিওরফেরেট

@ পিফেরেফ্রেট যদি accelerateঅটোমোবাইল বিমূর্ত শ্রেণীর মূল আচরণের অংশ হয়, তবে আমি বলতে পারি না accelerateযে চুক্তিটির প্রকৃতি দেখায় । চুক্তি প্রকৃতি কী? contractআমরা যখনই কথা বলি কেন এই শব্দটির পরিচয় হয় interface?
ওভাররেচেন্জ

@ সার্বভৌম বিনিময় কারণ সাধারণত ইন্টারফেসটি কেবল যেখানে দুটি 'পৃষ্ঠতল' মিলিত হয় তবে শব্দ চুক্তিটি বোঝায় যে দুটি 'পৃষ্ঠতল' কীভাবে মিলিত হয় তার একটি চুক্তি রয়েছে । এটির কোনও ধারণা নেই (কমপক্ষে আমার কাছে) যে এক্সস্ট তৈরি করা এমন কিছু যা আপনি 'সম্মত'। তবে এটি অর্থ (আবার আমার কাছে) বোঝায় যে আপনি জ্বালানীর ব্যবহারের প্রয়োজনের বিষয়ে একমত হতে পারেন।
পিওরফেরেট

1
@ পূর্বফেরেট আমি একই লিঙ্কে একটি প্রশ্ন উত্থাপন করেছি

1
@ পিওফেরেটে যদি interfaceপেরিফেরিয়াল আচরণের প্রয়োজন হয় তবে এর public interface List<E> extends Collection<E> {}মূল আচরণটি বর্ণনা করার জন্য কেন ডিজাইন করা হয়েছে list? এটি প্রকৃতপক্ষে প্রসূনের উত্তরের বিরোধী। উভয় Collection<E>এবং List<E>এখানে ইন্টারফেস হয়।

198

সংক্ষিপ্ত: অনুরূপ শ্রেণীর শ্রেণিবিন্যাসের মডেলিংয়ের জন্য অ্যাবস্ট্রাক্ট ক্লাসগুলি ব্যবহার করা হয় (উদাহরণস্বরূপ প্রাণী অ্যাবস্ট্রাক্ট শ্রেণি হতে পারে এবং মানব, সিংহ, বাঘটি কংক্রিটের উত্সযুক্ত শ্রেণি হতে পারে)

এবং

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


7
আমি সত্যিই এই উত্তর মত উত্তর দিতে কখনও কখনও কঠিন কারণ "কি" যেমন বিমূর্ত কিছু দিকে তাকিয়ে জিনিসের মধ্যে ভিন্ন অভিপ্রায় শুধুমাত্র পরিবর্তে গঠন (যেমন গঠনের দিক, একটি ইন্টারফেস এবং একটি বিশুদ্ধ বিমূর্ত বর্গ প্রায় কাছাকাছি একই জিনিস)।
16

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

2
@ ধনঞ্জয়: আমি দেখছি কীভাবে প্রাণী শ্রেণীর ধারণা থেকে উচ্চতা বিচ্ছিন্ন হতে পারে এবং অন্য একটি পৃথক শ্রেণীর হতে পারে, তবে ক্লাসগুলির মধ্যে "যোগাযোগ" বলতে আসলে কী বোঝ? এটি কেবল নিজের শ্রেণীর জন্য উচ্চতা সংজ্ঞা দিচ্ছে, সঠিক?
টিটিটি

77

অন্যান্য কয়েকটি পার্থক্য রয়েছে -

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

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

অ্যাবস্ট্রাক্ট বেস ক্লাসগুলি API কে ভঙ্গ না করে v2 + এ পরিবর্তন করা যেতে পারে। ইন্টারফেসের পরিবর্তনগুলি ব্রেকিং পরিবর্তনগুলি।

[সি # /। নেট স্পেসিফিক] ইন্টারফেসগুলি, বিমূর্ত বেস শ্রেণীর বিপরীতে, মান ধরণের (স্ট্রাক্ট) প্রয়োগ করা যেতে পারে। স্ট্রাক্টগুলি বিমূর্ত বেস ক্লাস থেকে উত্তরাধিকারী হতে পারে না। এটি মান ধরণের ক্ষেত্রে আচরণগত চুক্তি / ব্যবহারের নির্দেশিকাগুলি প্রয়োগ করতে দেয়।


5
এক শ্রেণির উপর একাধিক ইন্টারফেস প্রয়োগ করা যেতে পারে সেই মূল পয়েন্টের জন্য +1।
সিজিপি

বিমূর্ত বেস ক্লাসগুলি, আইএমওর মাধ্যমে ইন্টারফেসের ক্ষেত্রে এটিই আসল সুবিধা। অন্যথায়, আমি .NET নকশার গাইডলাইনগুলির সাথে একমত, যা এখন "ইন্টারফেসের চেয়ে অ্যাবস্ট্রাক্ট বেস ক্লাস পছন্দ করে" বলে মনে করে
রিড কোপসি

যদিও, আপনি আগ্রহী হবেন যদি আপনি যে বিন্দুটি যোগ করতে পারেন তবে এটি কোনও ইন্টারফেসও কোনও শ্রেণিতে প্রয়োগ করা যেতে পারে।
সিজিপি

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

এই সঠিক বিবরণের জন্য আপনাকে অনেক ধন্যবাদ। এটা আসলে খুব সহায়ক। আপনি উত্তর দিবেন না. দুঃখের বিষয় আপনি দুটি উত্তরকে "উত্তর" হিসাবে বেছে নিতে পারবেন না। আমাকে বিভ্রান্ত করার একটি জিনিস হ'ল আপনার অ্যাবস্ট্রাক্ট 'বেস' শ্রেণীর ব্যবহার। সমস্ত বিমূর্ত শ্রেণি বোঝানো হয় একটি সাবক্লাসের বেস ক্লাস। অতিরিক্ত 'বেস' নামকরণ কেন?
হিউম্যান

68

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

public class Vehicle {
    private Driver driver;
    private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
    //You can define as many properties as you want here ...
}

এখন একটি সাইকেল ...

public class Bicycle extends Vehicle {
    //You define properties which are unique to bicycles here ...
    private Pedal pedal;
}

এবং একটি গাড়ী ...

public class Car extends Vehicle {
    private Engine engine;
    private Door[] doors;
}

উত্তরাধিকার সম্পর্কে এটাই । আমরা উপরে হিসাবে দেখেছি সহজ বেস ফর্ম এবং তাদের শিশুদের মধ্যে অবজেক্টগুলিকে শ্রেণিবদ্ধ করতে এগুলি ব্যবহার করি।

বিমূর্ত ক্লাস

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

//......Code of Vehicle Class
abstract public void drive();
//.....Code continues

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

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

public interface Dialable {
    public void dial(Number n);
}

এখানে ডায়ালবলের নির্মাতা সংখ্যার ডায়াল কীভাবে করবেন তা নির্ধারণ করে। আপনাকে ডায়াল করার জন্য কেবল এটির একটি নম্বর দেওয়া দরকার।

// Makers define how exactly dialable work inside.

Dialable PHONE1 = new Dialable() {
    public void dial(Number n) {
        //Do the phone1's own way to dial a number
    }
}

Dialable PHONE2 = new Dialable() {
    public void dial(Number n) {
        //Do the phone2's own way to dial a number
    }
}


//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
    Dialable myDialable = SomeLibrary.PHONE1;
    SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....

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

এবং আরও গুরুত্বপূর্ণ , যদি কোনও দিন আপনি ডায়ালবেলটিকে অন্য কোনও দিয়ে স্যুইচ করেন

......
public static void main(String[] args) {
    Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
    SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....

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

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

আরও তথ্য বিমূর্ত শ্রেণি বনাম ইন্টারফেস


এটি সত্য নয় যে "ইন্টারফেসের কোনও বৈশিষ্ট্য নেই"।
বিগাইজস

@ বিগাইজস, জাভা ইন্টারফেসে বৈশিষ্ট্যগুলিকে অনুমতি দেয় না। আমি ভেবেছিলাম এটি অন্যান্য ভাষায়ও একই ছিল। আপনি আরও ব্যাখ্যা করতে পারেন?
fz_salam

আমি সি # /। নেট উল্লেখ করছি। দয়া করে উদাহরণটি দেখুন
বিগেইজস

@ বিগাইজ সি সি # এর জন্য যেখানে ইন্টারফেসের বৈশিষ্ট্য থাকতে পারে, তাতে কি একাধিক উত্তরাধিকারের সমস্যা পুনরায় উত্পন্ন হয় না? যখন কোনও শ্রেণি একাধিক ইন্টারফেস ব্যবহার করে যা একই সম্পত্তির সংজ্ঞা দেয়? কেবল কৌতূহলী ধন্যবাদ
17:55 এ স্ট্যাকপুষার

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

45

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

ওরাকল ওয়েবসাইটinterface এবং abstractশ্রেণীর মধ্যে মূল পার্থক্য সরবরাহ করে ।

বিমূর্ত ক্লাস ব্যবহার বিবেচনা করুন যদি:

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

ইন্টারফেস ব্যবহার বিবেচনা করুন যদি:

  1. আপনি আশা করেন যে সম্পর্কযুক্ত ক্লাসগুলি আপনার ইন্টারফেসটি কার্যকর করবে। উদাহরণস্বরূপ, অনেকগুলি সম্পর্কযুক্ত অবজেক্ট Serializableইন্টারফেস প্রয়োগ করতে পারে ।
  2. আপনি কোনও নির্দিষ্ট ডেটা ধরণের আচরণ নির্দিষ্ট করতে চান তবে কে তার আচরণটি প্রয়োগ করে তা নিয়ে উদ্বিগ্ন নন।
  3. আপনি একাধিক প্রকারের উত্তরাধিকারের সুযোগ নিতে চান।

সহজ কথায়, আমি ব্যবহার করতে চাই

ইন্টারফেস: একাধিক সম্পর্কযুক্ত অবজেক্টের দ্বারা একটি চুক্তি কার্যকর করা

বিমূর্ত শ্রেণি: একাধিক সম্পর্কিত বস্তুর মধ্যে একই বা ভিন্ন আচরণ বাস্তবায়নের জন্য

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


33

সাক্ষাত্কারকরা একটি বিজোড় গাছের ঝাঁকুনি দিচ্ছেন। সি # এবং জাভা এর মতো ভাষার ক্ষেত্রেও পার্থক্য রয়েছে, তবে অন্যান্য ভাষাতে সি ++ নেই। ওও তত্ত্ব দুটি ভাষার পার্থক্য রাখে না, কেবল ভাষার বাক্য গঠন।

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

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


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

31

ইন্টারফেস বাস্তবায়নের মাধ্যমে আপনি উত্তরাধিকারের পরিবর্তে ("এটি-এ" সম্পর্ক) রচনা ("আছে-একটি" সম্পর্ক) অর্জন করছেন। এটি যখন ডিজাইনের ধরণগুলির মতো জিনিসগুলির ক্ষেত্রে আসে তখন এটি একটি গুরুত্বপূর্ণ নীতি মনে রাখবেন যেখানে উত্তরাধিকারের পরিবর্তে আচরণের একটি রচনা অর্জনের জন্য আপনাকে ইন্টারফেস ব্যবহার করতে হবে।


17
ইন্টারফেসগুলি অর্জন করে, আইএমও, আরও একটি "আইন-কানুন হিসাবে" সম্পর্ক। এনক্যাপসুলেশন একটি ইন্টারফেসের চেয়ে আরও ভাল রচনাটি অর্জন করে।
রিড কোপসি

12
আমি মনে করি না বাস্তবায়ন ইন্টারফেসগুলি রচনার আওতায় আসবে।
পবন দিত্তকবি

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

26

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

  1. আমাদের ইন্টারফেস কখন ব্যবহার করা উচিত?

    আপনি যদি বাস্তবায়ন সম্পর্কে জানেন না কেবল আমাদের প্রয়োজনীয়তার নির্দিষ্টকরণ রয়েছে তবে আমরা ইন্টারফেসের সাথে চলে যাই

  2. আমাদের কখন অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করা উচিত?

    আপনি যদি বাস্তবায়ন জানেন তবে সম্পূর্ণরূপে (আংশিক বাস্তবায়ন) না হন তবে আমরা অ্যাবস্ট্রাক্ট ক্লাসের সাথে যাই।

    ইন্টারফেস

    ডিফল্ট পাবলিক বিমূর্তের দ্বারা প্রতিটি পদ্ধতি মানে ইন্টারফেস 100% খাঁটি বিমূর্ত থাকে।

    বিমূর্ত

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

    ইন্টারফেস

    আমরা ইন্টারফেসটিকে ব্যক্তিগত, সুরক্ষিত হিসাবে ঘোষণা করতে পারি না

    প্র: আমরা কেন ইন্টারফেসকে ব্যক্তিগত এবং সুরক্ষিত হিসাবে ঘোষণা করছি না?

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

    ইন্টারফেস পদ্ধতিটিও
    আমরা ইন্টারফেসটিকে ব্যক্তিগত, সুরক্ষিত, চূড়ান্ত, স্ট্যাটিক, সিঙ্ক্রোনাইজড, নেটিভ হিসাবে ঘোষণা করতে পারি না .....

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

    বিমূর্ত

    আমরা আনন্দের সাথে সরকারী, ব্যক্তিগত চূড়ান্ত স্থির সাথে ব্যবহার করছি .... মানে অ্যাবস্ট্রাক্টে কোনও বিধিনিষেধ প্রযোজ্য নয়।

    ইন্টারফেস

    ইন্টারফেসে ভেরিয়েবলগুলি একটি পূর্বনির্ধারিত পাবলিক স্ট্যাটিক ফাইনাল হিসাবে ঘোষিত হয় যাতে আমরা ব্যক্তিগত, সুরক্ষিত হিসাবেও ভেরিয়েবল হিসাবে ঘোষণা করি না।

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

    এবং উদ্বায়ী ভেরিয়েবল পরিবর্তন হয় তাই এটি বিপরীতে। চূড়ান্ত কারণ যে আমরা ইন্টারফেসে উদ্বায়ী ভেরিয়েবল ব্যবহার করা হয় না।

    বিমূর্ত

    অ্যাবস্ট্রাক্ট ভেরিয়েবলকে পাবলিক স্ট্যাটিক ফাইনাল ঘোষণা করার দরকার নেই।

আমি আশা করি এই নিবন্ধটি দরকারী।


4
আমি এই বিষয়টির সাথে একমত নই: Abstract class must have at lease one abstract method.যতক্ষণ আপনি এটি প্রয়োগ করেন ততক্ষণ কোনও অ্যাবস্ট্রাক্ট পদ্ধতি ছাড়াই একটি অ্যাবস্ট্রাক্ট ক্লাস থাকা সম্ভব। রেফারেন্স: An abstract class is a class that is declared abstract—it may or may not include abstract methods.সূত্র উল্লেখ: docs.oracle.com/javase/tutorial/java/IandI/abstract.html
Devner

আপনি প্রযুক্তিগত বিশদ এবং বাস্তবায়নের বিষয়ে কথা বলছেন, আপনি সাধারণ
ওওপির

26

ধারণাগতভাবে বলতে গেলে, ভাষা নির্দিষ্ট প্রয়োগ, নিয়ম, সুবিধা রেখে এবং যে কেউ বা উভয়কে ব্যবহার করে যে কোনও প্রোগ্রামিং লক্ষ্য অর্জন করা যায়, কোড / ডেটা / সম্পত্তি, ব্লাহ ব্লাহ, একক বা একাধিক উত্তরাধিকার থাকতে পারে বা রাখতে পারে না

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

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

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

যখন আপনাকে পার্থক্য সম্পর্কে জিজ্ঞাসা করা হয়, এটি আসলে ধারণাগত পার্থক্য ভাষা-নির্দিষ্ট প্রয়োগের মধ্যে পার্থক্য নয়, যদি না স্পষ্টভাবে জিজ্ঞাসা করা হয়।

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

আপনার যদি কেবল বিমূর্ত পদ্ধতি সহ একটি বিমূর্ত শ্রেণি থাকে তবে কী হবে?


বেশ সুন্দরভাবে এই প্রশ্নের উত্তর যথেষ্ট পরিমাণে যোগ করে।
pranavn

কার্যকারিতা বাস্তবায়িত বনাম কাঠামো প্রসারিত, দুর্দান্ত!
haর্ষvchawla

21

নেট জন্য,

দ্বিতীয় সাক্ষাত্কারকারীর কাছে আপনার উত্তরও প্রথমটির উত্তর ... অ্যাবস্ট্রাক্ট ক্লাসগুলির বাস্তবায়ন হতে পারে, এবং রাষ্ট্রের, ইন্টারফেসগুলিও থাকতে পারে না ...

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


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

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

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

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

20

ইন্টারফেস : যদি আপনি একে অপরের সাথে সম্পর্কিত বা নাও হতে পারে এমন উপাদানগুলির উপর কোনও নিয়ম বোঝাতে চান তবে ব্যবহার করা উচিত

পেশাদাররা:

  1. একাধিক উত্তরাধিকারের অনুমতি দেয়
  2. কোন প্রসঙ্গে সঠিক ধরণের অবজেক্টটি ব্যবহৃত হচ্ছে তা প্রকাশ না করে বিমূর্ততা সরবরাহ করে
  3. চুক্তির একটি নির্দিষ্ট স্বাক্ষর দ্বারা ধারাবাহিকতা সরবরাহ করে

কনস:

  1. সংজ্ঞায়িত সমস্ত চুক্তি বাস্তবায়ন করতে হবে
  2. ভেরিয়েবল বা প্রতিনিধি থাকতে পারে না
  3. একবারে সংজ্ঞায়িত সমস্ত ক্লাস না ভেঙে পরিবর্তন করা যাবে না

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

পেশাদাররা:

  1. ইন্টারফেস চেয়ে দ্রুত
  2. বাস্তবায়নে নমনীয়তা রয়েছে (আপনি এটি সম্পূর্ণ বা আংশিকভাবে প্রয়োগ করতে পারেন)
  3. উত্পন্ন ক্লাসগুলি না ভেঙে সহজেই পরিবর্তন করা যায়

কনস:

  1. তাত্ক্ষণিক হতে পারে না
  2. একাধিক উত্তরাধিকার সমর্থন করে না

দ্রুত সংজ্ঞা দিন। এটা কি তাৎপর্যপূর্ণ? এর অর্থ কী? একটি বিমূর্ত শ্রেণিতে ফাংশন আহ্বানের জন্য অপকোড একটি ইন্টারফেসে ফাংশন আহ্বানের জন্য অপকোডের চেয়ে দ্রুত?
অস্বীকার 631

@ denis631 বিমূর্ত শ্রেণিটি ইন্টারফেসের তুলনায় কিছুটা দ্রুত গতিযুক্ত কারণ অনুসন্ধান এবং কলটি ইন্টারফেস পদ্ধতির মধ্যে জড়িত। এই কোডরঞ্চটি / টি
503450/

17

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

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

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

সুতরাং ইন্টারফেসের একটি বাস্তব স্থাপত্যের ভূমিকা রয়েছে যখন বিমূর্ত ক্লাসগুলি প্রায়শই বাস্তবায়নের বিশদ (যদি আপনি অবশ্যই এটি সঠিকভাবে ব্যবহার করেন)।


13
After all that, the interviewer came up with the question "What if you had an 
Abstract class with only abstract methods? How would that be different
from an interface?" 

ডক্স স্পষ্টভাবে বলে যে কোনও বিমূর্ত শ্রেণিতে যদি কেবল বিমূর্ত পদ্ধতি ঘোষণা থাকে তবে পরিবর্তে এটি একটি ইন্টারফেস হিসাবে ঘোষণা করা উচিত।

An another interviewer asked me what if you had a Public variable inside
the interface, how would that be different than in Abstract Class?

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

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


13
  1. ইন্টারফেস:
    • আমরা পদ্ধতিগুলি বাস্তবায়ন করি না (বা সংজ্ঞায়িত) করি না, আমরা তা উদ্ভূত শ্রেণিতে করি।
    • আমরা ইন্টারফেসে সদস্য ভেরিয়েবল ঘোষণা করি না।
    • ইন্টারফেসগুলি HAS-A সম্পর্ককে প্রকাশ করে। তার মানে তারা বস্তুর মুখোশ।
  2. বিমূর্ত শ্রেণি:
    • আমরা বিমূর্ত শ্রেণিতে পদ্ধতিগুলি ঘোষণা এবং সংজ্ঞায়িত করতে পারি।
    • আমরা এর নির্মাণকারীদের আড়াল করি। তার অর্থ এটি থেকে সরাসরি কোনও বস্তু তৈরি হয়নি।
    • বিমূর্ত শ্রেণি সদস্য ভেরিয়েবল ধরে রাখতে পারে।
    • উত্পন্ন ক্লাসগুলি বিমূর্ত শ্রেণিতে উত্তরাধিকার সূত্রে বোঝায় যে উত্পন্ন ক্লাস থেকে আসা বস্তুগুলি মুখোশযুক্ত নয়, এটি বিমূর্ত শ্রেণিতে উত্তরাধিকার সূত্রে প্রাপ্ত। এই ক্ষেত্রে সম্পর্কটি আইএস-এ।

এটা আমার মতামত.


12

সিএফআর থেকে সি # এর মাধ্যমে জেফ্রি রিখটার অনুলিপি করেছেন ...

আমি প্রায়শই প্রশ্নটি শুনতে পাই, "আমার কি বেস টাইপ বা ইন্টারফেস ডিজাইন করা উচিত?" উত্তরটি সবসময় ক্লিয়ারকাট হয় না।

এখানে কিছু গাইডলাইন যা আপনাকে সহায়তা করতে পারে:

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

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

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

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


1
@ আব্দুল্লাহশহৈব হ'ল-এ এবং যে কেউ করতে-করতে পারে কিন্তু করতে পারে না, এখানে পার্থক্য রয়েছে। এটিই মূল কারণ, আমাদের ইন্টারফেস দরকার। করণীয় আচরণ abstract classপাশাপাশি অংশ হবে ।
ওভাররেঞ্জচেঞ্জ

10

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

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

সি # ইন্টারফেসের উত্তরাধিকারের জন্যও অনুমতি দেয়, মনে রাখবেন।


1
অনুভূমিক এবং উল্লম্ব পদগুলি ব্যবহার করে পার্থক্যটি কল্পনা করা খুব স্পষ্ট হয়ে উঠল।
অনন্ত

10

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

একটি ইন্টারফেস একটি চুক্তি । এটি নির্দিষ্ট করে: "এভাবেই আমরা একে অপরের সাথে কথা বলব"। এটির কোনও বাস্তবায়ন থাকতে পারে না কারণ এটির কোনও বাস্তবায়ন হওয়ার কথা নয় । এটি একটি চুক্তি। এটি .hসি এর হেডার ফাইলগুলির মতো

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

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

পর্দার পিছনে, একটি ইন্টারফেস মূলত কেবল বিমূর্ত পদ্ধতি সহ একটি বিমূর্ত শ্রেণি, এটি কোনও ব্যাপার নয়। ধারণামূলকভাবে, তারা সম্পূর্ণ ভিন্ন ভূমিকা পূরণ করে।


10

বিশেষজ্ঞদের কাছ থেকে আপনি যেমন তাত্ত্বিক জ্ঞান পেয়ে থাকতে পারেন, আমি এখানে সমস্তগুলি পুনরাবৃত্তি করতে খুব বেশি শব্দ ব্যয় করছি না, বরং আমাকে একটি সাধারণ উদাহরণ দিয়ে ব্যাখ্যা করতে পারি যেখানে আমরা ব্যবহার করতে পারি / ব্যবহার করতে পারি না Interfaceএবং Abstract class

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

নীচের বর্গটি সমস্ত গাড়ির জন্য একটি বেস শ্রেণি হিসাবে কাজ করে:

public class Cars
{
    public string DigitalFuelMeter()
    {
        return "I have DigitalFuelMeter";
    }

    public string AirCondition()
    {
        return "I have AC";
    }

    public string SeatAdjust()
    {
        return "I can Adjust seat";
    }
}

প্রতিটি গাড়ীর জন্য আমাদের একটি পৃথক শ্রেণি রয়েছে তা বিবেচনা করুন।

public class Alto : Cars
{
    // Have all the features of Car class    
}

public class Verna : Cars
{
    // Have all the features of Car class + Car need to inherit ABS as the Braking technology feature which is not in Cars        
}

public class Cruze : Cars
{
    // Have all the features of Car class + Car need to inherit EBD as the Braking technology feature which is not in Cars        
}

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

public abstract class Brake
{
    public abstract string GetBrakeTechnology();
}

এখন আমরা এই বিমূর্ত শ্রেণীর কাছ থেকে উত্তরাধিকারী হওয়ার চেষ্টা করছি এবং ভেরনা এবং ক্রুজ এ ধরণের ব্রেকিং সিস্টেম প্রয়োগ করা হয়েছে:

public class Verna : Cars,Brake
{
    public override string GetBrakeTechnology()
    {
        return "I use ABS system for braking";
    }       
}

public class Cruze : Cars,Brake
{
    public override string GetBrakeTechnology()
    {
       return "I use EBD system for braking";
    }         
}

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

interface IBrakeTechnology
{
    string GetBrakeTechnology();
}

এবং বাস্তবায়ন নীচে দেওয়া হল:

public class Verna : Cars, IBrakeTechnology
{
    public string GetBrakeTechnology()
    {
        return "I use ABS system for braking";
    }
}

public class Cruze : Cars, IBrakeTechnology
{
   public string GetBrakeTechnology()
   {
       return "I use EBD system for braking";
   }        
}

এখন ভার্না এবং ক্রুজ ইন্টারফেসের সাহায্যে তার নিজস্ব ব্রেকিং প্রযুক্তিগুলির সাথে একাধিক উত্তরাধিকার অর্জন করতে পারে।


4
উদাহরণগুলির কারণে এটি সর্বোত্তম ব্যাখ্যা।
অ্যাডাম মেন্ডোজা

2
এটি আমার মস্তিষ্ককে ছড়িয়ে না দিয়ে বোঝায়। আমি আমার ছাত্রদের জন্য একটি গাড়ির উদাহরণ নিয়ে আসার চেষ্টা করছিলাম। এটি একসাথে রাখার জন্য সময় দেওয়ার জন্য ধন্যবাদ।
তাজবয়

9

ইন্টারফেসগুলি একটি নির্দিষ্ট আচরণ প্রয়োগের হালকা ওজনের উপায়। এটি ভাবার এক উপায়।


8

এই উত্তরগুলি সমস্ত দীর্ঘ।

  • ইন্টারফেসগুলি আচরণের সংজ্ঞা দেওয়ার জন্য।

  • বিমূর্ত শ্রেণিগুলি কোনও জিনিসকে তার আচরণগুলি সহ নিজেই সংজ্ঞায়িত করার জন্য। এজন্য আমরা মাঝে মাঝে কিছু অতিরিক্ত বৈশিষ্ট্য সহ একটি ইন্টারফেস উত্তরাধিকার সূত্রে একটি বিমূর্ত শ্রেণি তৈরি করি।

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


7

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

2) আপনি একটি ইন্টারফেসে একটি সম্পত্তি সংজ্ঞায়িত করতে পারেন, সুতরাং যে ইন্টারফেসটি প্রয়োগ করে এমন শ্রেণীর অবশ্যই সেই সম্পত্তি থাকতে হবে।

উদাহরণ স্বরূপ:

  public interface IVariable
  {
      string name {get; set;}
  }

যে ইন্টারফেসটি প্রয়োগ করে এমন শ্রেণীর অবশ্যই এর মতো একটি সম্পত্তি থাকতে হবে।


7

যদিও এই প্রশ্নটি বেশ পুরানো, আমি ইন্টারফেসের পক্ষে অন্য একটি পয়েন্ট যুক্ত করতে চাই:

ইন্টারফেসগুলি যে কোনও ডিপেন্ডেন্সি ইনজেকশন সরঞ্জামগুলি ব্যবহার করে ইনজেক্ট করা যেতে পারে যেখানে অ্যাবস্ট্রাক্ট ক্লাস ইঞ্জেকশন হিসাবে খুব কম লোকই সমর্থন করে supported


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

6

আমার অন্য উত্তর থেকে , বেশিরভাগ ক্ষেত্রে যখন অন্যটির বিপরীতে কোনওটি ব্যবহার করা হয় তখন তা নিয়ে ডিল করা হয়:

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


6

ইন্টারফেসের প্রকারগুলি বনাম বিমূর্ত বেস ক্লাসগুলি

প্রো সি # 5.0 এবং .NET 4.5 ফ্রেমওয়ার্ক বই থেকে গৃহীত হয়েছে ।

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

public abstract class CloneableType
{
// Only derived types can support this
// "polymorphic interface." Classes in other
// hierarchies have no access to this abstract
// member.
   public abstract object Clone();
}

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

// Nope! Multiple inheritance is not possible in C#
// for classes.
public class MiniVan : Car, CloneableType
{
}

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

public interface ICloneable
{
object Clone();
}

6

দ্বিতীয় প্রশ্নের উত্তর: publicপরিবর্তনশীল সংজ্ঞায়িত interfaceহয় static finalডিফল্টরূপে যখন publicমধ্যে পরিবর্তনশীল abstractবর্গ একটি দৃষ্টান্ত পরিবর্তনশীল।


6

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

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

ইন্টারফেস:

এমন একটি জিনিস বা পরিস্থিতি যা পৃথক এবং কখনও কখনও অসম্পূর্ণ উপাদানগুলিকে কার্যকরভাবে সমন্বয় করতে সক্ষম করে।

সারাংশ:

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

উদাহরণ:

আপনি একটি গাড়ী কিনেছেন এবং এটিতে জ্বালানী দরকার।

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

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

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

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

অভিযোজ্য বস্তু

এছাড়াও, আমি মনে করি আপনার এই শব্দটি শ্রেণীর অর্থটি মনে রাখা উচিত, যা (পূর্বে উল্লিখিত একই সাইট থেকে):

ক্লাস:

প্রচলিত গুণাবলী, বৈশিষ্ট্য, গুণাবলী বা বৈশিষ্ট্যের কারণে একটি দল গঠন হিসাবে গণ্য হওয়া বেশ কয়েকটি ব্যক্তি বা জিনিস; ধরনের;

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


1
খুব বেশি ফ্লাফ, এটি ইতিমধ্যে যেভাবে হতে পারে তার চেয়ে বেশি বিভ্রান্তিকর শোনান না।
গাঞ্জেইই

5

কোডিং দৃষ্টিকোণ থেকে

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

ডিজাইন দৃষ্টিভঙ্গি থেকে

এটি যদি একটি "ইস" সম্পর্ক হয় এবং আপনার একটি উপসেট বা সমস্ত কার্যকারিতা প্রয়োজন হয় তবে এটি একটি অ্যাবস্ট্রাক্ট ক্লাস হিসাবে রাখুন। এটি "করণীয়" সম্পর্ক হলে ইন্টারফেস হিসাবে রাখুন।

আপনার কী প্রয়োজন তা ঠিক করুন: কেবল নীতি প্রয়োগকারী বা কোড পুনরায় ব্যবহারযোগ্যতা এবং নীতি।


3

অন্যান্য পার্থক্যের যুগল:

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

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


জাভাতে, ইন্টারফেসের সদস্য পরিবর্তনশীল থাকতে পারে তবে ডিফল্টরূপে তারা পাবলিক স্ট্যাটিক হয়ে যায় .. সুতরাং ইন্টারফেসের স্থির ক্ষেত্র থাকতে পারে
জিতেন্দ্র ভিসপুট

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