ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে কি কেবল বিমূর্ত পদ্ধতি রয়েছে এর মধ্যে কোনও পার্থক্য রয়েছে?


9

ধরা যাক আমাদের একটি বিমূর্ত শ্রেণি রয়েছে এবং এই শ্রেণীর কেবলমাত্র বিমূর্ত পদ্ধতি রয়েছে। এই বিমূর্ত শ্রেণিটি কেবল একই পদ্ধতিযুক্ত ইন্টারফেসের থেকে আলাদা?

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


কোন ভাষা?
কেভিন cline

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

3
@ ব্ল্যাঙ্ক আমি আপনার প্রশ্নের ক্ষেত্রে সদৃশ স্থিতির সাথে দ্বিমত পোষণ করেছি তাই আমি এটি আবার খুললাম ened আপনি কী জিজ্ঞাসা করছেন তা আমি বিশ্বাস করি তা আরও স্পষ্ট করতে আরও আমি আপনার প্রশ্ন সম্পাদনা করেছি।
maple_shaft

উত্তর:


22

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

একটি বিমূর্ত সুপারক্লাসটি যা ঠিক মনে হয় তা হ'ল এটি একটি সাধারণ প্রকার যা বিড়াল এবং কুকুরের মতো প্রাণী হ'ল অন্যান্য অনেক ধরণের দ্বারা ভাগ করা।

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

তবে সেগুলি এখনও প্রাণী এবং তাদের কিছু সাধারণ সম্পত্তি রয়েছে যেমন তারা জীবিত বা মৃত।

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

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


4
+1, যদিও বিড়ালরা সাপ বা টিকটিকিগুলির চেয়ে অনেক বেশি বিরক্তিকর উপায়ে ফেলে।
ম্যাথু ফ্লিন

প্রযুক্তিগতভাবে: বিমূর্ত পদ্ধতিগুলি সুরক্ষিত করা যায়। ইন্টারফেস পদ্ধতি ক্যান্ট।
জ্যাক্স কোয়ার্টস

19

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


3
সবচেয়ে? আপনি কোনটি গণনা করছেন? আমি জানি বেশিরভাগ ওওপি ভাষাগুলির ইন্টারফেস বা বিমূর্ত শ্রেণি নেই। সি ++ এর কেবল বিমূর্ত ক্লাস রয়েছে।
কেভিন cline

10
@ কেভিঙ্কলাইন: সম্ভবত সি #, জাভা এবং ভিবি.এনইটি।
টিডামাররা

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

@tdammers: এলএল। এটা একটা কৌতুক ছিল , তাই না?
কেভিন ক্লিইন

3

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

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

একটি ইন্টারফেস বাইরের বিশ্বের জন্য একটি চুক্তি হিসাবে কাজ করে, যখন একটি বিমূর্ত শ্রেণি একটি বাস্তবায়ন সরবরাহ করতে পারে, যদিও যদি ইন্টারফেসটিকে "নকল" হিসাবে ব্যবহার করা হয়, তবে সম্ভবত এটি হবে না।

মূল ধারণাগত পার্থক্যটি হ'ল যখন কোনও শ্রেণি অন্য শ্রেণীর উত্তরাধিকারী হয় (বিমূর্ত বা না) তখন "হয়" এর একটি সম্পর্ক থাকে, সুতরাং a Carহয় Vehicleএবং Dogএকটি হয় Animal। একটি ইন্টারফেসের সাথে, এটি বিষয়টির জন্য গুরুত্বপূর্ণ। সুতরাং Carএবং উভয়ই Dogহতে পারে Move()এবং ভোক্তা এটি জানেন কারণ তারা প্রয়োগ করে Movableতবে একটি গাড়ি অবশ্যই একটি Dog, বা নয় Animal। এবং সরানো বাস্তবায়ন আলাদা হবে (চাকা বনাম পা) তবে গ্রাহক কোডটি যত্ন করে না এবং করা উচিত নয়। ইন্টারফেসগুলি প্রয়োগের পরিবর্তে গ্রাহক কোড সম্পর্কিত।

মূল বক্তব্যটি হ'ল যদি আপনার পছন্দের ভাষাটিতে আপনার ইন্টারফেস থাকে, তবে সেগুলি সেখানে রয়েছে এমন জিনিসের জন্য তাদের ব্যবহার করুন। যদি না হয় (সি ++ এর মতো) তবে আপনি খাঁটি বিমূর্ত ক্লাস ব্যবহার করে তাদের জাল করতে পারেন।


ইন্টারফেস তাই আপনি যদি একটি IAnimal আছে যা উভয় পারে, পাশাপাশি এক প্রকার Dogএবং Cat হয়
অ্যামি ব্লাকনশিপ

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

2

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

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


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

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

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

2

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


2

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

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

প্রশ্নের সাথে প্রাসঙ্গিক নয়: তবে ইন্টারফেস থাকার অর্থ একটি শ্রেণি দুটি পৃথক চুক্তি বাস্তবায়ন করতে পারে। সুতরাং এটি একটি বিমূর্ত সুপার বর্গ উপর একটি ইন্টারফেস সুবিধা


1
কোনও বাস্তবায়ন ছাড়াই বিমূর্ত পদ্ধতিগুলি সংজ্ঞায়িত করা হয় না, এবং প্রয়োগটি উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণিতে ছেড়ে যায়?
ইভান পিন্টার

হ্যাঁ আপনার ডান ঠিক আছে তবে আমি অনুমান করি এটির ভেরিয়েবল, কনস্ট্রাক্টর এবং স্ট্যাটিক ও প্রাইভেট পদ্ধতিগুলি যদি আপনি সেগুলি গণনা করেন
tgkprog

@ পিনিট্রি, অনুশীলনের বেশিরভাগ সময় আপনি আপনার অ্যাবস্ট্রাক্ট ক্লাসে কমপক্ষে একটি "রিয়েল" কোড চাইবেন (কমপক্ষে আমি যে ভাষাটি ব্যবহার করি তাতে ভাষায়, যার অ্যাবস্ট্রাক্ট ক্লাসগুলির জন্য বিশেষ গঠন নেই)।
অ্যামি ব্লাকনশিপ

@ অ্যামিব্ল্যাঙ্কেনশিপ হ্যাঁ, বেশিরভাগ সময় বিমূর্ত ক্লাসগুলির "আসল" কোড থাকে (এটি তারা সেখানে রয়েছে)। তবে আমি বিমূর্ত পদ্ধতিগুলি উল্লেখ করছিলাম, একটি নিখুঁত বিমূর্ত শ্রেণীর প্রসঙ্গে যা সি ++ এর মতো ভাষার ইন্টারফেস হিসাবে কাজ করে, যার ইন্টারফেস নেই have
ইভান পিন্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.