একটি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্যটি ঠিক কী?
একটি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্যটি ঠিক কী?
উত্তর:
একটি ইন্টারফেস একটি চুক্তি : ইন্টারফেস লেখার ব্যক্তি বলে, " আরে, আমি সেভাবে দেখায় জিনিসগুলি গ্রহণ করি ", এবং ইন্টারফেসটি ব্যবহার করা ব্যক্তি বলে " ঠিক আছে, আমি যে ক্লাসটি লিখি সেভাবে দেখায় "।
একটি ইন্টারফেস একটি খালি শেল হয় । কেবলমাত্র পদ্ধতিগুলির স্বাক্ষর রয়েছে, যা সূচিত করে যে পদ্ধতিগুলির কোনও দেহ নেই। ইন্টারফেস কিছুই করতে পারে না। এটি কেবল একটি নিদর্শন
উদাহরণস্বরূপ (সিউডো কোড):
// I say all motor vehicles should look like this:
interface MotorVehicle
{
void run();
int getFuel();
}
// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{
int fuel;
void run()
{
print("Wrroooooooom");
}
int getFuel()
{
return this.fuel;
}
}
একটি ইন্টারফেস বাস্তবায়ন খুব কম সিপিইউ গ্রহণ করে, কারণ এটি কোনও শ্রেণি নয়, কেবল নামগুলির একটি গুচ্ছ, এবং তাই করার জন্য কোনও ব্যয়বহুল চেহারা নেই isn't এম্বেড থাকা ডিভাইসে যেমন এটি গুরুত্বপূর্ণ তখন এটি দুর্দান্ত।
ইন্টারফেসের বিপরীতে বিমূর্ত শ্রেণি ক্লাস হয়। এগুলি ব্যবহারে আরও ব্যয়বহুল, কারণ আপনি যখন তাদের কাছ থেকে উত্তরাধিকারী হবেন তখন করতে হবে।
বিমূর্ত শ্রেণিগুলি ইন্টারফেসের মতো দেখতে অনেক বেশি লাগে তবে তাদের আরও কিছু আছে: আপনি তাদের জন্য কোনও আচরণ নির্ধারণ করতে পারেন। একজন ব্যক্তির সম্পর্কে এটি আরও বেশি বলা হচ্ছে, " এই ক্লাসগুলি এমন হওয়া উচিত এবং এগুলি সাদৃশ্যপূর্ণ, তাই শূন্যস্থান পূরণ করুন! " !
উদাহরণ স্বরূপ:
// I say all motor vehicles should look like this:
abstract class MotorVehicle
{
int fuel;
// They ALL have fuel, so lets implement this for everybody.
int getFuel()
{
return this.fuel;
}
// That can be very different, force them to provide their
// own implementation.
abstract void run();
}
// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
void run()
{
print("Wrroooooooom");
}
}
বিমূর্ত শ্রেণি এবং ইন্টারফেসগুলি বিভিন্ন ধারণা হিসাবে ধারণা করা হয়, বাস্তবায়নগুলি কখনও কখনও এই বিবৃতিটিকে অসত্য করে তোলে। কখনও কখনও, তারা এমনকি আপনি তাদের মনে হয় না।
জাভাতে, এই নিয়মটি দৃ strongly়ভাবে প্রয়োগ করা হয়েছে, যখন পিএইচপি-তে ইন্টারফেসগুলি বিমূর্ত শ্রেণি যেখানে কোনও পদ্ধতি ঘোষিত হয়নি।
পাইথনে, বিমূর্ত ক্লাসগুলি আরও একটি প্রোগ্রামিং ট্রিক যা আপনি এবিসি মডিউল থেকে পেতে পারেন এবং প্রকৃতপক্ষে মেটাক্লাসগুলি ব্যবহার করছেন এবং তাই ক্লাসগুলি। এবং ইন্টারফেসগুলি এই ভাষায় হাঁসের টাইপিংয়ের সাথে আরও সম্পর্কিত এবং এটি কনভেনশন এবং বিশেষ পদ্ধতির মধ্যে মিশ্রণ যা ডেস্ক্রিপ্টারকে ডাক দেয় (__Mod__ পদ্ধতি)।
প্রোগ্রামিংয়ের সাথে যথারীতি, অন্য ভাষায় তত্ত্ব, অনুশীলন এবং অনুশীলন রয়েছে :-)
interface
এবং class
থেকে Head First Java
প্রাণবন্ত যেA class defines who you are, and an interface tells what roles you could play
বিমূর্ত শ্রেণি এবং একটি ইন্টারফেসের মধ্যে মূল প্রযুক্তিগত পার্থক্যগুলি হ'ল :
অ্যাবস্ট্রাক্ট ক্লাসে ধ্রুবক, সদস্য, মেথড স্টাব (দেহ ব্যতীত পদ্ধতি) এবং সংজ্ঞায়িত পদ্ধতি থাকতে পারে , তবে ইন্টারফেসে কেবল ধ্রুবক এবং পদ্ধতি স্টাব থাকতে পারে ।
কোনও বিমূর্ত শ্রেণির পদ্ধতি এবং সদস্যদের যে কোনও দৃশ্যমানতার সাথে সংজ্ঞায়িত করা যায় , অন্যদিকে ইন্টারফেসের সমস্ত পদ্ধতি অবশ্যই সংজ্ঞায়িত করা উচিত public
(সেগুলি ডিফল্টরূপে সর্বজনীন সংজ্ঞায়িত করা হয়)।
বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে, একটি কংক্রিট শিশু শ্রেণিকে অবশ্যই বিমূর্ত পদ্ধতিগুলি সংজ্ঞায়িত করতে হবে , যেখানে একটি বিমূর্ত শ্রেণি আরেকটি বিমূর্ত শ্রেণি প্রসারিত করতে পারে এবং পিতাম শ্রেণীর বিমূর্ত পদ্ধতিগুলি সংজ্ঞায়িত করতে হবে না।
একইভাবে, অন্য ইন্টারফেসের প্রসারিত একটি ইন্টারফেস প্যারেন্ট ইন্টারফেস থেকে পদ্ধতিগুলি প্রয়োগের জন্য দায়ী নয় । এটি কারণ ইন্টারফেস কোনও প্রয়োগের সংজ্ঞা দিতে পারে না।
একটি শিশু শ্রেণি কেবলমাত্র একটি একক শ্রেণি (বিমূর্ত বা কংক্রিট) প্রসারিত করতে পারে, যেখানে কোনও ইন্টারফেস প্রসারিত করতে পারে বা কোনও শ্রেণি একাধিক অন্যান্য ইন্টারফেস প্রয়োগ করতে পারে ।
একটি শিশু শ্রেণি একই বা কম সীমাবদ্ধ দৃশ্যমানতার সাথে বিমূর্ত পদ্ধতিগুলি সংজ্ঞায়িত করতে পারে , অন্যদিকে ইন্টারফেস প্রয়োগকারী কোনও শ্রেণীর অবশ্যই একই একই দৃশ্যমানতার (পাবলিক) সাথে পদ্ধতিগুলি সংজ্ঞায়িত করতে হবে।
CANNOT
তাত্ক্ষণিকভাবে করা হয়।
একটি ইন্টারফেসে কেবল কার্যকারিতার সংজ্ঞা / স্বাক্ষর থাকে এবং যদি আমাদের কিছু সাধারণ কার্যকারিতা পাশাপাশি সাধারণ স্বাক্ষর থাকে তবে আমাদের একটি বিমূর্ত শ্রেণি ব্যবহার করা দরকার। একটি বিমূর্ত ক্লাস ব্যবহার করে, আমরা একই সাথে আচরণের পাশাপাশি কার্যকারিতা উভয়ই সরবরাহ করতে পারি। অন্য বিকাশকারী অ্যাবস্ট্রাক্ট বর্গ উত্তরাধিকার সূত্রে এই কার্যকারিতাটি সহজেই ব্যবহার করতে পারে কারণ তাদের কেবল শূন্যস্থান পূরণ করতে হবে।
http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html
http://www.dotnetbull.com/2011/11/ কি- is- abstract- class- in-c- net.html http://www.dotnetbull.com/2011/11/ কি- is- interface- in -c-net.html
এখানে একটি ব্যাখ্যা পাওয়া যাবে: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Class-and-the-Aadapter-Pattern.htm
একটি বিমূর্ত শ্রেণি এমন একটি বর্গ যা কেবলমাত্র প্রোগ্রামার দ্বারা আংশিকভাবে প্রয়োগ করা হয়। এটিতে এক বা একাধিক বিমূর্ত পদ্ধতি থাকতে পারে। একটি বিমূর্ত পদ্ধতিটি কেবল একটি ফাংশন সংজ্ঞা যা প্রোগ্রামারকে জানাতে পরিবেশন করে যে পদ্ধতিটি একটি শিশু শ্রেণিতে প্রয়োগ করা আবশ্যক।
একটি ইন্টারফেস একটি বিমূর্ত শ্রেণীর অনুরূপ; প্রকৃতপক্ষে ইন্টারফেসগুলি ক্লাস এবং বিমূর্ত শ্রেণীর মতো একই নামস্থান দখল করে। সেই কারণে আপনি ক্লাসের মতো একই নামের ইন্টারফেসটি সংজ্ঞায়িত করতে পারবেন না। একটি ইন্টারফেস সম্পূর্ণ বিমূর্ত শ্রেণি; এর কোনও পদ্ধতিই প্রয়োগ করা হয়নি এবং এটি থেকে শ্রেণি উপ-শ্রেণিবদ্ধকরণের পরিবর্তে, সেই ইন্টারফেসটি প্রয়োগ করার কথা বলা হয়।
যাইহোক আমি ইন্টারফেসের এই ব্যাখ্যাটি কিছুটা বিভ্রান্তিকর খুঁজে পাই। আরও সাধারণ সংজ্ঞাটি হ'ল: একটি ইন্টারফেস একটি চুক্তি সংজ্ঞা দেয় যা বাস্তবায়নকারী ক্লাসগুলি অবশ্যই পূরণ করে। একটি ইন্টারফেস সংজ্ঞা কোনও প্রয়োগকারী কোড ছাড়াই জনগণের সদস্যদের স্বাক্ষর নিয়ে গঠিত।
আমি এই পার্থক্যগুলি হাইলাইট করতে চাই না, যা ইতিমধ্যে অনেক উত্তরে বলা হয়েছে (ইন্টারফেসে ভেরিয়েবলের জন্য পাবলিক স্ট্যাটিক ফাইনাল মডিফায়ার সম্পর্কিত এবং বিমূর্ত শ্রেণিতে সুরক্ষিত, ব্যক্তিগত পদ্ধতিগুলির জন্য সমর্থন)
সহজ কথায়, আমি বলতে চাই:
ইন্টারফেস: একাধিক সম্পর্কযুক্ত অবজেক্টের দ্বারা একটি চুক্তি কার্যকর করা
বিমূর্ত শ্রেণি: একাধিক সম্পর্কিত বস্তুর মধ্যে একই বা ভিন্ন আচরণ বাস্তবায়নের জন্য
ওরাকল ডকুমেন্টেশন থেকে
বিমূর্ত ক্লাস ব্যবহার বিবেচনা করুন যদি:
ইন্টারফেস ব্যবহার বিবেচনা করুন যদি:
Serializable
ইন্টারফেস প্রয়োগ করতে পারে ।বিমূর্ত শ্রেণি প্রতিষ্ঠিত হয় "একটি" কংক্রিট শ্রেণীর সাথে সম্পর্ক relation ইন্টারফেস ক্লাস জন্য "একটি" ক্ষমতা প্রদান করে।
আপনি যদি Java
প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে সন্ধান করেন তবে এখানে আরও কয়েকটি আপডেট রয়েছে:
জাভা 8 কোনও পদ্ধতি বৈশিষ্ট্য সরবরাহ করে শ্রেণি interface
এবং abstract
শ্রেণীর মধ্যে ব্যবধান কিছুটা কমিয়েছে default
। একটি ইন্টারফেসের কোনও পদ্ধতির জন্য বাস্তবায়ন নেই এখন আর বৈধ নয়।
আরও তথ্যের জন্য এই ডকুমেন্টেশন পৃষ্ঠা দেখুন।
কোড উদাহরণগুলি আরও ভালভাবে বোঝার জন্য এই এসই প্রশ্নটি দেখুন।
একটি ইন্টারফেস এবং একটি বিমূর্ত শ্রেণীর মধ্যে পার্থক্যটি আমি কীভাবে ব্যাখ্যা করব?
কিছু গুরুত্বপূর্ণ পার্থক্য:
একটি টেবিল আকারে:
জাভাপেপারস থেকে জো দ্বারা বর্ণিত হিসাবে :
1. প্রধান পার্থক্য হ'ল জাভা ইন্টারফেসের পদ্ধতিগুলি স্পষ্টত বিমূর্ত এবং এর বাস্তবায়ন থাকতে পারে না। একটি জাভা বিমূর্ত শ্রেণীর উদাহরণ পদ্ধতি থাকতে পারে যা একটি ডিফল্ট আচরণ প্রয়োগ করে।
2. জাভা ইন্টারফেসে ঘোষিত ভেরিয়েবলগুলি ডিফল্টরূপে চূড়ান্ত হয়। একটি বিমূর্ত শ্রেণিতে অ-চূড়ান্ত ভেরিয়েবল থাকতে পারে।
3. একটি জাভা ইন্টারফেসের সদস্যগুলি ডিফল্টরূপে সর্বজনীন। একটি জাভা বিমূর্ত শ্রেণিতে শ্রেণীর সদস্যদের ব্যক্তিগত স্বাদ যেমন ব্যক্তিগত, সুরক্ষিত ইত্যাদি হতে পারে have
৪. জাভা ইন্টারফেস প্রয়োগ করতে হবে মূল শব্দ "প্রয়োগসমূহ" ব্যবহার করে; একটি জাভা বিমূর্ত শ্রেণীর শব্দটি "প্রসারিত" ব্যবহার করে প্রসারিত করা উচিত।
৫.আপনার ইন্টারফেসটি কেবল অন্য জাভা ইন্টারফেসকে প্রসারিত করতে পারে, একটি বিমূর্ত শ্রেণি অন্য জাভা শ্রেণি প্রসারিত করতে পারে এবং একাধিক জাভা ইন্টারফেস প্রয়োগ করতে পারে।
A.এ জাভা ক্লাস একাধিক ইন্টারফেস বাস্তবায়ন করতে পারে তবে এটি কেবল একটি বিমূর্ত শ্রেণিকে প্রসারিত করতে পারে।
7. ইন্টারফেস একেবারে বিমূর্ত এবং তাত্ক্ষণিকভাবে স্থাপন করা যায় না; একটি জাভা বিমূর্ত শ্রেণিও তাত্ক্ষণিকভাবে চালু করা যায় না, তবে একটি প্রধান () উপস্থিত থাকলে তাকে আহ্বান করা যেতে পারে।
৮. জাভা বিমূর্ত শ্রেণীর সাথে তুলনা করার জন্য, জাভা ইন্টারফেসগুলি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে সেটিকে বাড়তি দিকনির্দেশের প্রয়োজন হয়।
মূল কথাটি হ'ল:
আমি 300 তলা একটি বিল্ডিং নির্মাণ করছি
বিল্ডিংয়ের ব্লুপ্রিন্ট ইন্টারফেস
বিল্ডিং 200 তলা পর্যন্ত নির্মিত - আংশিক সমাপ্ত --- বিমূর্ত
বিল্ডিং নির্মাণ সমাপ্ত - কংক্রিট
ইন্টারফেস
বিমূর্ত
দুর্গা জবস ওয়েবসাইট থেকে নেওয়া
এই প্রশ্নে আবার কাজ করা যাক:
আপনাকে প্রথমে জানাতে হবে যে 1/1 এবং 1 * 1 এর ফলাফল একই, তবে এর অর্থ এই নয় যে গুণ এবং ভাগ এক are স্পষ্টতই, তারা কিছু ভাল সম্পর্ক রাখে তবে মনে রাখবেন আপনি উভয়ই আলাদা।
আমি প্রধান পার্থক্যগুলি উল্লেখ করব এবং বাকীগুলি ইতিমধ্যে ব্যাখ্যা করা হয়েছে:
অ্যাবস্ট্রাক্ট ক্লাসগুলি শ্রেণি শ্রেণিবিন্যাসের মডেলিংয়ের জন্য দরকারী। কোনো প্রয়োজন প্রথম নজরে, আমরা কী নিয়ে আংশিকভাবে স্পষ্ট ঠিক নির্মাণ করা হয়, কিন্তু আমরা জানি বানাতে কতো। এবং তাই আপনার বিমূর্ত ক্লাসগুলি আপনার বেস ক্লাস হয়।
ইন্টারফেসগুলি অন্য শ্রেণিবিন্যাস বা শ্রেণিগুলিকে জানার জন্য দরকারী যে আমি কী করতে সক্ষম। এবং যখন আপনি বলেন যে আমি কোনও কিছুর জন্য সক্ষম, আপনার অবশ্যই সেই ক্ষমতা থাকতে হবে। কোনও শ্রেণীর জন্য একই কার্যকারিতা বাস্তবায়নের জন্য ইন্টারফেসগুলি এটি বাধ্যতামূলক হিসাবে চিহ্নিত করবে।
এটি আসলে বেশ সহজ।
আপনি একটি ইন্টারফেসটিকে একটি শ্রেণি হিসাবে ভাবতে পারেন যা কেবল বিমূর্ত পদ্ধতি এবং অন্য কিছুই থাকতে পারে।
সুতরাং একটি ইন্টারফেস কেবল "ঘোষণা" করতে পারে এবং শ্রেণীর যে আচরণটি আপনি চান তা সংজ্ঞায়িত করতে পারে না।
একটি বিমূর্ত শ্রেণি আপনাকে ক্লাসের যে আচরণ করতে চায় তা নির্ধারণ করার পাশাপাশি (বিমূর্ত পদ্ধতি ব্যবহার করে) উভয়কে সংজ্ঞায়িত করতে (সম্পূর্ণ পদ্ধতি প্রয়োগকরণ ব্যবহার করে) করতে দেয়।
এবং একটি নিয়মিত ক্লাস কেবলমাত্র আপনাকে ক্লাসের যে আচরণ / ক্রিয়াকলাপ করতে চায় তা নির্ধারণ করতে, ঘোষণা করার জন্য নয়।
ত্য জ্যজ্জকিজ,
জাভাতে, আপনি একাধিক ইন্টারফেস প্রয়োগ করতে পারেন তবে আপনি কেবল একটি (বিমূর্ত শ্রেণি বা শ্রেণি) প্রসারিত করতে পারেন ...
এর অর্থ সংজ্ঞায়িত আচরণের উত্তরাধিকার কেবলমাত্র প্রতি ক্লাসে একজনকে অনুমতি দেওয়ার মধ্যে সীমাবদ্ধ ... অর্থাৎ আপনি যদি ক্লাস এ, বি এবং সি এর কাছ থেকে নেওয়া এমন একটি ক্লাস চান তবে আপনার নিম্নলিখিতটি করা দরকার: ক্লাস এ বি বি বর্ধিত করে, ক্লাস সি প্রসারিত করে .. একাধিক উত্তরাধিকার পাওয়ার জন্য এটি প্রায় এক রাউন্ড ...
অন্যদিকে ইন্টারফেসগুলি, আপনি কেবল পারেন: ইন্টারফেস সি প্রয়োগ করে এ, বি
সুতরাং কার্যকরভাবে জাভা একাধিক উত্তরাধিকারকে কেবলমাত্র "ঘোষিত আচরণ" অর্থাৎ ইন্টারফেসগুলিতে এবং সংজ্ঞায়িত আচরণের সাথে একক উত্তরাধিকারকে সমর্থন করে .. যদি না আপনি আমার বর্ণনা মতো রাস্তা না করেন ...
আশা করি তা বোধগম্য হয়।
ইন্টারফেস বনাম অ্যাবস্ট্রাক্ট ক্লাসের তুলনা ভুল। পরিবর্তে অন্য দুটি তুলনা থাকতে হবে: 1) ইন্টারফেস বনাম শ্রেণি এবং 2) বিমূর্ত বনাম চূড়ান্ত শ্রেণি ।
ইন্টারফেস দুটি বস্তুর মধ্যে একটি চুক্তি। উদাহরণস্বরূপ, আমি একজন পোস্টম্যান এবং আপনি সরবরাহ করার প্যাকেজ। আমি আশা করি আপনি আপনার বিতরণ ঠিকানা জানতে হবে। যখন কেউ আমাকে একটি প্যাকেজ দেয়, তখন এটির সরবরাহের ঠিকানাটি জানতে হবে:
interface Package {
String address();
}
শ্রেণি হ'ল বস্তুর একটি গ্রুপ যা চুক্তি মেনে চলে। উদাহরণস্বরূপ, আমি "বক্স" গ্রুপের একটি বাক্স এবং আমি পোস্টম্যানের প্রয়োজনীয় চুক্তিটি মানি। একই সাথে আমি অন্যান্য চুক্তিগুলিও মানি:
class Box implements Package, Property {
@Override
String address() {
return "5th Street, New York, NY";
}
@Override
Human owner() {
// this method is part of another contract
}
}
বিমূর্ত শ্রেণি অসম্পূর্ণ বস্তুর একটি গ্রুপ। এগুলি ব্যবহার করা যাবে না, কারণ তারা কিছু অংশ মিস করে। উদাহরণস্বরূপ, আমি একটি বিমূর্ত জিপিএস-সচেতন বক্স - আমি মানচিত্রে আমার অবস্থান কীভাবে চেক করব তা আমি জানি:
abstract class GpsBox implements Package {
@Override
public abstract String address();
protected Coordinates whereAmI() {
// connect to GPS and return my current position
}
}
এই শ্রেণিটি, যদি অন্য শ্রেণীর দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত / প্রসারিত হয় তবে এটি খুব দরকারী। তবে নিজেই - এটি অকেজো, যেহেতু এটিতে বস্তু থাকতে পারে না। বিমূর্ত ক্লাসগুলি চূড়ান্ত শ্রেণির উপাদান তৈরি করতে পারে।
ফাইনাল ক্লাস সম্পূর্ণ অবজেক্টের একটি গ্রুপ, যা ব্যবহার করা যেতে পারে, তবে পরিবর্তন করা যায় না। তারা ঠিক কীভাবে কাজ করতে হবে এবং কী করতে হবে তা জানে। উদাহরণস্বরূপ, আমি একটি বাক্স যা সর্বদা এটির নির্মাণের সময় নির্দিষ্ট ঠিকানায় যায়:
final class DirectBox implements Package {
private final String to;
public DirectBox(String addr) {
this.to = addr;
}
@Override
public String address() {
return this.to;
}
}
জাভা বা সি ++ এর মতো বেশিরভাগ ভাষায়, কেবল একটি ক্লাস থাকা সম্ভব , না বিমূর্ত বা চূড়ান্ত। এই জাতীয় বর্গ উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে এবং তাত্ক্ষণিকভাবে তৈরি করা যেতে পারে। যদিও আমি মনে করি না যে এটি বস্তু-কেন্দ্রিক দৃষ্টান্তের সাথে যথাযথভাবে সামঞ্জস্যপূর্ণ।
আবার বিমূর্ত শ্রেণীর সাথে ইন্টারফেসের তুলনা করা সঠিক নয়।
সংক্ষেপে পার্থক্যগুলি নিম্নলিখিত:
ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে সিন্ট্যাক্টিকাল পার্থক্য :
ইন্টারফেসে এখন:
public static
- সমর্থিত
public abstract
- সমর্থিত
public default
- সমর্থিত
private static
- সমর্থিত
private abstract
- সংকলন ত্রুটি
private default
- সংকলন ত্রুটি
private
- সমর্থিত
পার্থক্যটি হ'ল এক ব্যক্তি একাধিক উত্তরাধিকারে অংশ নিতে পারে এবং অন্যটি পারে না।
একটি ইন্টারফেসের সংজ্ঞা সময়ের সাথে সাথে পরিবর্তিত হয়েছে। আপনি কি মনে করেন যে কোনও ইন্টারফেসের কেবল পদ্ধতি ঘোষণাগুলি রয়েছে এবং এটি কেবল চুক্তি? স্ট্যাটিক ফাইনাল ভেরিয়েবল সম্পর্কে কী এবং জাভা 8 এর পরে ডিফল্ট সংজ্ঞাগুলি সম্পর্কে কী?
একাধিক উত্তরাধিকার নিয়ে ডায়মন্ড সমস্যার কারণে জাভাতে ইন্টারফেসগুলি প্রবর্তিত হয়েছিল এবং এটিই তারা বাস্তবে করতে চায়।
ইন্টারফেসগুলি এমন এক নির্মাণ যা একাধিক উত্তরাধিকার সমস্যা থেকে মুক্তি পেতে তৈরি করা হয়েছিল এবং এতে বিমূর্ত পদ্ধতি, ডিফল্ট সংজ্ঞা এবং স্থিতিশীল চূড়ান্ত ভেরিয়েবল থাকতে পারে।
আপনার যদি এমন কিছু সাধারণ পদ্ধতি থাকে যা একাধিক ক্লাস দ্বারা ব্যবহার করা যায় তবে বিমূর্ত ক্লাসে যান। অন্যথায় যদি আপনি ক্লাসগুলি কিছু নির্দিষ্ট ব্লুপ্রিন্ট অনুসরণ করতে চান ইন্টারফেসে যান।
নিম্নলিখিত উদাহরণগুলি এটি দেখায়।
জাভাতে বিমূর্ত শ্রেণি:
abstract class animals
{
// They all love to eat. So let's implement them for everybody
void eat()
{
System.out.println("Eating...");
}
// The make different sounds. They will provide their own implementation.
abstract void sound();
}
class dog extends animals
{
void sound()
{
System.out.println("Woof Woof");
}
}
class cat extends animals
{
void sound()
{
System.out.println("Meoww");
}
}
জাভাতে ইন্টারফেসের একটি বাস্তবায়ন নিম্নলিখিত:
interface Shape
{
void display();
double area();
}
class Rectangle implements Shape
{
int length, width;
Rectangle(int length, int width)
{
this.length = length;
this.width = width;
}
@Override
public void display()
{
System.out.println("****\n* *\n* *\n****");
}
@Override
public double area()
{
return (double)(length*width);
}
}
class Circle implements Shape
{
double pi = 3.14;
int radius;
Circle(int radius)
{
this.radius = radius;
}
@Override
public void display()
{
System.out.println("O"); // :P
}
@Override
public double area()
{
return (double)((pi*radius*radius)/2);
}
}
সংক্ষেপে কয়েকটি গুরুত্বপূর্ণ মূল বিষয়:
জাভা ইন্টারফেসে ঘোষিত ভেরিয়েবলগুলি ডিফল্টরূপে চূড়ান্ত হয়। বিমূর্ত শ্রেণিতে অ-চূড়ান্ত ভেরিয়েবল থাকতে পারে।
জাভা ইন্টারফেসে ঘোষিত ভেরিয়েবলগুলি ডিফল্ট স্থিতিশীল। বিমূর্ত শ্রেণিতে অ স্থির ভেরিয়েবল থাকতে পারে।
একটি জাভা ইন্টারফেসের সদস্যরা ডিফল্টরূপে সর্বজনীন। একটি জাভা বিমূর্ত শ্রেণিতে শ্রেণীর সদস্যদের ব্যক্তিগত স্বাদ যেমন ব্যক্তিগত, সুরক্ষিত ইত্যাদি হতে পারে have
অনেক জুনিয়র বিকাশকারী ইন্টারফেস, বিমূর্ত এবং কংক্রিটের ক্লাসগুলি একই জিনিসটির সামান্য প্রকরণ হিসাবে ভাবার ভুল করে এবং এর মধ্যে একটিকে বিশুদ্ধভাবে প্রযুক্তিগত কারণে বেছে নেন: আমার কি একাধিক উত্তরাধিকার প্রয়োজন? সাধারণ পদ্ধতিগুলি রাখার জন্য আমার কি কোনও জায়গা দরকার? আমাকে কি কেবল একটি কংক্রিটের ক্লাস ছাড়া অন্য কিছু নিয়ে বিরক্ত করার দরকার আছে? এটি ভুল, এবং এই প্রশ্নগুলিতে লুকানো প্রধান সমস্যা: "আমি" । আপনি যখন নিজের জন্য কোড লেখেন, নিজেই, আপনি খুব কমই উপস্থিত বা ভবিষ্যতের বিকাশকারীদের আপনার কোডটিতে বা তার সাথে কাজ করার কথা ভাবেন।
ইন্টারফেস এবং অ্যাবস্ট্রাক্ট ক্লাসগুলি যদিও প্রযুক্তিগত দৃষ্টিকোণ থেকে দৃশ্যত অনুরূপ, সম্পূর্ণ ভিন্ন অর্থ এবং উদ্দেশ্য রয়েছে।
একটি ইন্টারফেস এমন একটি চুক্তি সংজ্ঞা দেয় যা কিছু বাস্তবায়ন আপনার জন্য পূরণ করবে ।
একটি বিমূর্ত শ্রেণি একটি ডিফল্ট আচরণ সরবরাহ করে যা আপনার প্রয়োগটি পুনরায় ব্যবহার করতে পারে।
একটি কংক্রিট শ্রেণি প্রকৃত কাজটি খুব নির্দিষ্ট উপায়ে করে। উদাহরণস্বরূপ, ArrayList
একটি কমপ্যাক্ট পদ্ধতিতে অবজেক্টের একটি তালিকা সংরক্ষণের জন্য মেমরির একটি সংক্ষিপ্ত অঞ্চল ব্যবহার করে যা দ্রুত এলোমেলো অ্যাক্সেস, পুনরাবৃত্তি এবং স্থান পরিবর্তনগুলি প্রস্তাব করে তবে সন্নিবেশ, মুছে ফেলা এবং মাঝে মাঝে এমনকি সংযোজনে ভয়ানক; ইতিমধ্যে, একটি LinkedList
বস্তুগুলির তালিকা সঞ্চয় করতে ডাবল-লিঙ্কযুক্ত নোড ব্যবহার করে, যা পরিবর্তে দ্রুত পুনরাবৃত্তি, স্থান পরিবর্তন এবং সন্নিবেশ / মোছা / সংযোজন সরবরাহ করে তবে এলোমেলো অ্যাক্সেসে ভয়াবহ। এই দুটি ধরণের তালিকাগুলি বিভিন্ন ব্যবহারের ক্ষেত্রে অনুকূলিত হয়েছে এবং আপনি কীভাবে সেগুলি ব্যবহার করতে চলেছেন তা অনেক গুরুত্বপূর্ণ। আপনি যখন একটি তালিকার সাথে ভারীভাবে ইন্টারঅ্যাক্ট করছেন তার বাইরে পারফরম্যান্সকে চেপে ধরার চেষ্টা করছেন এবং তালিকার ধরণটি আপনার উপর নির্ভর করে আপনি কোনটিকে ইনস্ট্যান্ট করছেন তা সাবধানতার সাথে বেছে নেওয়া উচিত।
অন্যদিকে, একটি তালিকার উচ্চ স্তরের ব্যবহারকারীরা কীভাবে এটি বাস্তবায়িত হয় তা সত্যিই চিন্তা করে না এবং তাদের এই বিবরণ থেকে উত্তাপিত করা উচিত। আসুন কল্পনা করুন যে জাভা List
ইন্টারফেসটি উন্মোচিত করেনি , তবে কেবল একটি কংক্রিট List
ক্লাস ছিল যা আসলে LinkedList
এখন। সমস্ত জাভা বিকাশকারীগণ তাদের কোডটি প্রয়োগের বিশদগুলিতে ফিট করার জন্য তৈরি করতেন: এলোমেলো অ্যাক্সেস এড়ানোর জন্য, অ্যাক্সেস গতি বাড়ানোর জন্য একটি ক্যাশে যুক্ত করা বা কেবল ArrayList
নিজেরাই পুনরায় সংশোধন করা, যদিও এটি কেবলমাত্র অন্য কোনও কোডের সাথে বেমানান হবে যা List
কেবলমাত্র এটির সাথে কাজ করে । এটি ভয়াবহ হবে ... তবে এখন ভাবুন যে জাভা মাস্টাররা বুঝতে পেরেছেন যে কোনও লিঙ্কযুক্ত তালিকা বেশিরভাগ প্রকৃত ব্যবহারের ক্ষেত্রে ভয়ানক, এবং তাদের কেবলমাত্র একটি অ্যারে তালিকায় স্যুইচ করার সিদ্ধান্ত নিয়েছেList
ক্লাস উপলব্ধ। এটি বিশ্বের প্রতিটি জাভা প্রোগ্রামের পারফরম্যান্সকে প্রভাবিত করবে এবং লোকেরা এতে খুশি হবে না। এবং মূল অপরাধী হ'ল বাস্তবায়নের বিশদ উপলব্ধ ছিল এবং বিকাশকারীরা ধরে নিয়েছিলেন যে এই বিবরণগুলি স্থায়ী চুক্তি যা তারা নির্ভর করতে পারে। এ কারণেই প্রয়োগের বিশদটি গোপন রাখা এবং কেবল একটি বিমূর্ত চুক্তি সংজ্ঞা দেওয়া গুরুত্বপূর্ণ। এটি একটি ইন্টারফেসের উদ্দেশ্য: কোনও পদ্ধতি কী ধরণের ইনপুট গ্রহণ করে এবং কী ধরণের আউটপুট প্রত্যাশিত তা নির্ধারণ করুন যা কোনও প্রোগ্রাম ভবিষ্যত আপডেটের সাথে পরিবর্তিত হতে পারে এমন অভ্যন্তরীণ বিশদগুলিতে ফিট করার জন্য তাদের কোডটি টুইট করতে প্রলুব্ধ করবে ।
ইন্টারফেস এবং কংক্রিট শ্রেণীর মাঝে একটি বিমূর্ত শ্রেণি মাঝখানে থাকে। এটি বাস্তবায়নগুলি সাধারণ বা বিরক্তিকর কোডটি ভাগ করে নেওয়ার ক্ষেত্রে সহায়তা করার কথা রয়েছে। উদাহরণস্বরূপ, আকারের উপর ভিত্তি AbstractCollection
করে বেসিক বাস্তবায়নগুলি isEmpty
0 হয়, পুনরাবৃত্তি হিসাবে এবং পুনরায় হিসাবে contains
তুলনা করা, ইত্যাদি on এটি বাস্তবায়নগুলি তাদের মধ্যে পার্থক্যপূর্ণ যে গুরুত্বপূর্ণ অংশগুলিতে ফোকাস করতে দেয়: কীভাবে আসলে ডেটা সংরক্ষণ এবং পুনরুদ্ধার করতে হয় toaddAll
add
ইন্টারফেসগুলি কোডের বিভিন্ন অংশের মধ্যে স্বল্প-সংহত গেটওয়ে । অভ্যন্তরীণভাবে যখন কিছু পরিবর্তন হয় তখন তারা লাইব্রেরিগুলিকে প্রতিটি লাইব্রেরি ব্যবহারকারীকে ভেঙে না ফেলে লাইব্রেরিগুলির উপস্থিতি এবং বিবর্তনের অনুমতি দেয়। এটিকে অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস বলা হয় , অ্যাপ্লিকেশন প্রোগ্রামিং ক্লাস নয়। আরও ছোট স্কেল এ, তারা ডকুমেন্টেড ইন্টারফেসের মাধ্যমে বিভিন্ন মডিউল পৃথক করে একাধিক বিকাশকারীকে বৃহত্তর প্রকল্পে সাফল্যের সাথে সহযোগিতা করার অনুমতি দেয়।
অ্যাবস্ট্রাক্ট ক্লাসগুলি একটি ইন্টারফেস বাস্তবায়নের সময় ব্যবহার করা উচিত উচ্চ-সংহতি সাহায্যকারী , কিছু স্তরের বাস্তবায়ন বিশদ গ্রহণ করে। বিকল্পভাবে, বিমূর্ত ক্লাসগুলি এসপিআই, পরিষেবা সরবরাহকারী ইন্টারফেসগুলি সংজ্ঞায়িত করার জন্য ব্যবহৃত হয়।
একটি এপিআই এবং এসপিআইয়ের মধ্যে পার্থক্যটি সূক্ষ্ম, তবে গুরুত্বপূর্ণ: কোনও এপিআইয়ের জন্য, কে এটি ব্যবহার করে সেদিকে মনোনিবেশ করা হয়েছে এবং কোনও এসপিআইয়ের জন্য কে এটি প্রয়োগ করে তার উপর ফোকাস ।
কোনও এপিআই-তে পদ্ধতি যুক্ত করা সহজ, এপিআই-র সমস্ত বিদ্যমান ব্যবহারকারী এখনও সংকলন করবে। এসপিআইতে পদ্ধতি যুক্ত করা শক্ত, যেহেতু প্রতিটি পরিষেবা সরবরাহকারীকে (কংক্রিট বাস্তবায়ন) নতুন পদ্ধতিগুলি প্রয়োগ করতে হবে। ইন্টারফেসগুলি যদি এসপিআই সংজ্ঞায়িত করতে ব্যবহৃত হয়, যখনই এসপিআই চুক্তি পরিবর্তিত হয় কোনও সরবরাহকারীকে একটি নতুন সংস্করণ প্রকাশ করতে হবে। যদি এর পরিবর্তে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করা হয় তবে নতুন পদ্ধতিগুলি হয় বিদ্যমান বিমূর্ত পদ্ধতিগুলির ক্ষেত্রে বা খালি throw not implemented exception
স্টাব হিসাবে সংজ্ঞায়িত করা যেতে পারে , যা কমপক্ষে কোনও পরিষেবা বাস্তবায়নের একটি পুরানো সংস্করণকে এখনও সংকলন ও চালনার অনুমতি দেয়।
যদিও জাভা 8 ইন্টারফেসের জন্য ডিফল্ট পদ্ধতি প্রবর্তন করেছে, যা ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে লাইনকে আরও ঝাপসা করে তোলে, এটি বাস্তবায়ন কোডটি পুনরায় ব্যবহার করতে পারে না, তবে এটি একটি API এবং এসপিআই হিসাবে পরিবেশনকারী ইন্টারফেসগুলিকে পরিবর্তন করা সহজতর করে তোলে (বা বিমূর্ত শ্রেণীর পরিবর্তে এসপিআই সংজ্ঞায়নের জন্য ভুলভাবে ব্যবহৃত হয়)।
একটি তাত্পর্য: অন্য উপায় প্রায়শই প্রায়শই ভুলভাবে করা হয়: কোনও জিনিস ব্যবহার করার সময় , সর্বদা আপনার প্রয়োজন এমন সর্বাধিক জেনেরিক শ্রেণি / ইন্টারফেসটি ব্যবহার করার চেষ্টা করুন। অন্য কথায়, আপনার ভেরিয়েবলগুলি হিসাবে ঘোষণা করবেন না ArrayList theList = new ArrayList()
, যদি না আপনি এটির অ্যারের তালিকার উপর নির্ভরযোগ্যভাবে নির্ভর করেন এবং অন্য কোনও ধরণের তালিকা এটি আপনার জন্য কাটবে না। List theList = new ArrayList
পরিবর্তে ব্যবহার করুন, বা এমনকি এটি Collection theCollection = new ArrayList
যদি এটি একটি তালিকা এবং অন্য কোনও ধরণের সংগ্রহের পক্ষে আসলে কিছু আসে যায় না তা এমনকি ।
আসল প্রশ্নের উত্তরটি সত্যই নয়, তবে একবারের মধ্যে পার্থক্যের উত্তর পাওয়া গেলে আপনি কখন ব্যবহার করতে পারবেন প্রতিটি দ্বিধা: ইন্টারফেস বা বিমূর্ত শ্রেণি কখন ব্যবহার করবেন? দু'জন কখন ব্যবহার করবেন?
আমি ওওপি সম্পর্কে সীমিত জ্ঞান রেখেছি, তবে ব্যাকরণে একটি বিশেষণের সমতুল্য হিসাবে ইন্টারফেসগুলি এখনও অবধি আমার জন্য কাজ করেছে (যদি এই পদ্ধতিটি বোগাস হয় তবে আমাকে সংশোধন করুন!)। উদাহরণস্বরূপ, ইন্টারফেসের নামগুলি এমন বৈশিষ্ট্য বা ক্ষমতাগুলির মতো যা আপনি কোনও শ্রেণিকে দিতে পারেন এবং একটি শ্রেণিতে এর মধ্যে অনেকগুলি থাকতে পারে: ইরিশায়াইজেবল, আইসিউন্টেবল, আইলিস্ট, আইসিএকেবল, আইএইচপি, ...
উত্তরাধিকার দুটি উদ্দেশ্যে ব্যবহৃত হয়:
কোনও বস্তুকে প্যারেন্ট-টাইপ ডেটা সদস্য এবং পদ্ধতি বাস্তবায়নকে তার নিজের হিসাবে বিবেচনা করার অনুমতি দেওয়ার জন্য।
কোড দ্বারা এক ধরণের অবজেক্টের রেফারেন্সকে অনুমতি দেওয়ার জন্য যা সুপার টাইপ অবজেক্টের রেফারেন্স আশা করে।
ভাষা / ফ্রেমওয়ার্কগুলিতে যা একাধিক উত্তরাধিকারকে সমর্থন করে, সাধারণত "ইন্টারফেস" বা "বিমূর্ত শ্রেণি" হিসাবে কোনও ধরণের শ্রেণিবদ্ধকরণের প্রয়োজন হয় না। জনপ্রিয় ভাষা এবং ফ্রেমওয়ার্কগুলি তবে কোনও প্রকারকে অন্য ধরণের ডেবাট সদস্য বা পদ্ধতি বাস্তবায়নকে তার নিজের হিসাবে বিবেচনা করার অনুমতি দেয় যদিও তারা অন্য ধরণের স্বেচ্ছাসেবী সংখ্যার জন্য কোনও প্রকারকে পরিবর্তনের যোগ্য করে দেয়।
অ্যাবস্ট্রাক্ট ক্লাসে ডেটা সদস্য এবং পদ্ধতি বাস্তবায়ন থাকতে পারে, তবে কেবলমাত্র এমন শ্রেণীর দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে যা অন্য কোনও শ্রেণীর উত্তরাধিকারসূত্রে হয় না। ইন্টারফেসগুলি এগুলি প্রয়োগ করে এমন ধরণের উপর প্রায় কোনও বিধিনিষেধ রাখে না, তবে কোনও ডেটা সদস্য বা পদ্ধতি বাস্তবায়ন অন্তর্ভুক্ত করতে পারে না।
বিভিন্ন সময়ে বিভিন্ন ধরণের পরিবর্তনের জন্য এটি কার্যকর হয়; অন্যান্য সময় আছে যখন প্যারেন্ট-টাইপ ডেটা সদস্যদের এবং পদ্ধতি বাস্তবায়নগুলিকে তাদের নিজের হিসাবে বিবেচনা করা অবজেক্টগুলির পক্ষে কার্যকর। ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্য তৈরি করা সেই মুহুর্তগুলিতে প্রতিটি ক্ষেত্রে সর্বাধিক প্রাসঙ্গিক ক্ষেত্রে ব্যবহার করার অনুমতি দেয়।
গুরুত্বপূর্ণ দিক:
সুবিধা:
এখানে বিশদ সন্ধান করুন ... http://praDPatkari.wordpress.com/2014/11/20/interface-and-abstract-class-in-c-oops/
এটির সংক্ষিপ্ততমতম উপায়টি interface
হ'ল:
default
এবং static
পদ্ধতি বাদে ; যদিও এর পদ্ধতি default
এবং static
পদ্ধতির সংজ্ঞা (পদ্ধতি স্বাক্ষর + বাস্তবায়ন) রয়েছে তবে এটি অন্যান্য পদ্ধতির জন্য কেবল ঘোষণাপত্র (পদ্ধতি স্বাক্ষর) রয়েছে।interface
গুলি প্রয়োগ করতে পারে , এবং একটি interface
একাধিক interface
গুলি থেকে উত্তরাধিকারী হতে পারে )। সমস্ত ভেরিয়েবল সুস্পষ্টভাবে ধ্রুবক হিসাবে নির্ধারিত হোক public static final
না কেন। সমস্ত সদস্য নিখুঁতভাবে public
নির্দিষ্ট, না যেমন নির্দিষ্ট করা হয় whetherএদিকে, একটি abstract
শ্রেণি হ'ল:
abstract
পদ্ধতির প্রবণতা সহ পুরোপুরি বিমূর্ত থেকে পুরোপুরি বাস্তবায়িত হওয়া যে কোনও জায়গায় । ঘোষণা হিসাবে চিহ্নিত হিসাবে ঘোষণা এবং সংজ্ঞা উভয়ই থাকতে পারে abstract
।protected
, private
অথবা ব্যক্তিগত প্যাকেজ (অনির্দিষ্ট)।অথবা, যদি আমরা এটি একটি বাক্যে সমস্ত সিদ্ধ করতে চাই: একটি interface
বাস্তবায়নকারী শ্রেণীর যা থাকে , তবে একটি abstract
শ্রেণি যা সাবক্লাস হয় ।
আমি আরও একটি পার্থক্য যুক্ত করতে চাই যা বোঝা যায়। উদাহরণস্বরূপ, কোডের কয়েক হাজার লাইনের সাথে আপনার একটি কাঠামো রয়েছে। এখন আপনি যদি কোনও পদ্ধতি বর্ধিত ইউআই () ব্যবহার করে কোড জুড়ে একটি নতুন বৈশিষ্ট্য যুক্ত করতে চান তবে ইন্টারফেসের পরিবর্তে অ্যাবস্ট্রাক্ট শ্রেণিতে সেই পদ্ধতিটি যুক্ত করা ভাল। কারণ, আপনি যদি কোনও ইন্টারফেসে এই পদ্ধতিটি যুক্ত করেন তবে আপনার এটি সমস্ত বাস্তবায়িত শ্রেণিতে প্রয়োগ করা উচিত তবে আপনি যদি বিমূর্ত শ্রেণিতে পদ্ধতিটি যুক্ত করেন তবে এটি ক্ষেত্রে নয়।
একটি সরল কিন্তু সুস্পষ্ট উত্তর দেওয়ার জন্য, এটি প্রসঙ্গটি সেট করতে সহায়তা করে: আপনি যখন সম্পূর্ণ বাস্তবায়ন সরবরাহ করতে চান না তখন আপনি উভয়ই ব্যবহার করেন।
তারপরে মূল পার্থক্য হ'ল একটি ইন্টারফেসের কোনও প্রয়োগই হয় না (কেবলমাত্র দেহ ব্যতীত পদ্ধতিগুলি) যখন বিমূর্ত শ্রেণিতে সদস্যদের এবং শরীরের সাথে পদ্ধতিগুলি থাকতে পারে, অর্থাৎ আংশিকভাবে প্রয়োগ করা যেতে পারে।
default
জাভা 8 এর মূলশব্দটিকে বিবেচনায় নেয় না যার সাহায্যে আপনি ইন্টারফেসেও কংক্রিটের পদ্ধতিগুলি সংজ্ঞায়িত করতে পারেন।
বাস্তব বাস্তবায়নের পক্ষে বিমূর্ত শ্রেণি এবং ইন্টারফেসের মধ্যে পার্থক্য।
ইন্টারফেস : এটি একটি কীওয়ার্ড এবং এটি কোনও টেমপ্লেটের টেমপ্লেট বা নীল প্রিন্ট সংজ্ঞায়িত করতে ব্যবহৃত হয় এবং এটি সমস্ত উপ শ্রেণিগুলিকে একই প্রোটোটাইপ অনুসরণ করতে বাধ্য করে, বাস্তবায়ন হিসাবে, সমস্ত উপ শ্রেণিগুলি কার্যকারিতা বাস্তবায়নের জন্য নিখরচায় এটি প্রয়োজন
অন্য কিছু ব্যবহারের ক্ষেত্রে যেখানে আমাদের ইন্টারফেস ব্যবহার করা উচিত।
ইন্টারফেসের মাধ্যমে সম্পন্ন দুটি বাহ্যিক অবজেক্টের (আমাদের অ্যাপ্লিকেশনটিতে তৃতীয় পক্ষের সংহতকরণ) মধ্যে যোগাযোগ ইন্টারফেস চুক্তি হিসাবে কাজ করে।
অ্যাবস্ট্রাক্ট ক্লাস: অ্যাবস্ট্রাক্ট, এটি একটি কীওয়ার্ড এবং যখন আমরা এই কিওয়ার্ডটি কোনও ক্লাসের আগে ব্যবহার করি তখন এটি বিমূর্ত শ্রেণিতে পরিণত হয়। এটি মূলত তখন ব্যবহৃত হয় যখন আমাদের টেমপ্লেটটি সংজ্ঞায়িত করতে হবে এবং সাথে সাথে কোনও অবজেক্টের কিছু ডিফল্ট কার্যকারিতাও অনুসরণ করা হয় যা সমস্ত বিষয় অনুসরণ করে সাব ক্লাস এবং এটি অপ্রয়োজনীয় কোড এবং আরও একটি ব্যবহারের ক্ষেত্রে সরিয়ে দেয় যেখানে আমরা বিমূর্ত ক্লাস ব্যবহার করতে পারি , যেমন আমরা চাই যে অন্য কোনও শ্রেণি ক্লাসের কোনও অবজেক্টকে সরাসরি ইনস্ট্যান্ট করতে পারে না, কেবল উত্পন্ন ক্লাসগুলি কার্যকারিতা ব্যবহার করতে পারে।
বিমূর্ত শ্রেণির উদাহরণ:
public abstract class DesireCar
{
//It is an abstract method that defines the prototype.
public abstract void Color();
// It is a default implementation of a Wheel method as all the desire cars have the same no. of wheels.
// and hence no need to define this in all the sub classes in this way it saves the code duplicasy
public void Wheel() {
Console.WriteLine("Car has four wheel");
}
}
**Here is the sub classes:**
public class DesireCar1 : DesireCar
{
public override void Color()
{
Console.WriteLine("This is a red color Desire car");
}
}
public class DesireCar2 : DesireCar
{
public override void Color()
{
Console.WriteLine("This is a red white Desire car");
}
}
ইন্টারফেস উদাহরণ:
public interface IShape
{
// Defines the prototype(template)
void Draw();
}
// All the sub classes follow the same template but implementation can be different.
public class Circle : IShape
{
public void Draw()
{
Console.WriteLine("This is a Circle");
}
}
public class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine("This is a Rectangle");
}
}
আপনি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে স্পষ্ট পার্থক্য খুঁজে পেতে পারেন ।
ইন্টারফেস
বিমূর্ত শ্রেণি
বিমূর্ত শ্রেণিতে বিমূর্ত এবং অ-বিমূর্ত পদ্ধতি রয়েছে।
বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে যখন ব্যবহারকারীরা সমস্ত পদ্ধতি প্রয়োগ করতে বাধ্য করেন না।
আদিম এবং অ-আদিম সহ সব ধরণের ভেরিয়েবল রয়েছে
বিমূর্ত কীওয়ার্ড ব্যবহার করে ঘোষণা করুন।
পদ্ধতি এবং একটি বিমূর্ত শ্রেণীর সদস্যদের যে কোনও দৃশ্যমানতার সাথে সংজ্ঞায়িত করা যায়।
একটি শিশু শ্রেণি কেবলমাত্র একটি একক শ্রেণি (বিমূর্ত বা কংক্রিট) প্রসারিত করতে পারে।
একটি বিমূর্ত শ্রেণি এমন একটি শ্রেণি যাঁর বস্তু তৈরি করা যায় না বা এমন একটি শ্রেণি যা তাত্ক্ষণিকভাবে চলতে পারে না। একটি বিমূর্ত পদ্ধতি একটি শ্রেণিকে বিমূর্ত করে তোলে। বিমূর্ত শ্রেণিতে ঘোষিত পদ্ধতিগুলি ওভাররাইড করার জন্য একটি বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া দরকার। অ্যাক্সেস স্পেসিফায়ারগুলিতে কোনও বাধা নেই। একটি বিমূর্ত শ্রেণীর মধ্যে কনস্ট্রাক্টর এবং অন্যান্য কংক্রিট (নন বিমূর্ত পদ্ধতি) পদ্ধতি থাকতে পারে তবে ইন্টারফেস থাকতে পারে না।
একটি ইন্টারফেস হ'ল একটি ব্লুপ্রিন্ট / পদ্ধতির টেম্পলেট ((উদাহরণস্বরূপ: কাগজের উপর একটি বাড়ি দেওয়া হয় (ইন্টারফেস হাউস) এবং বিভিন্ন আর্কিটেক্টরা এটি তৈরিতে তাদের ধারণাগুলি ব্যবহার করবেন (বাড়ির ইন্টারফেস প্রয়োগকারী স্থপতিদের ক্লাস)) এটি একটি সংগ্রহ বিমূর্ত পদ্ধতি, ডিফল্ট পদ্ধতি, স্ট্যাটিক পদ্ধতি, চূড়ান্ত ভেরিয়েবল এবং নেস্টেড ক্লাস।সব সদস্যই হয় চূড়ান্ত বা পাবলিক, সুরক্ষিত এবং ব্যক্তিগত অ্যাক্সেস স্পেসিফায়ারদের অনুমোদিত নয় object কোনও বস্তু তৈরির অনুমতি নেই use ব্যবহার করার জন্য একটি শ্রেণি তৈরি করতে হবে ইন্টারফেস বাস্তবায়ন এবং ইন্টারফেসে ঘোষিত বিমূর্ত পদ্ধতিটি ওভাররাইড করার জন্য একটি ইন্টারফেস হ'ল মিলিতকরণের একটি ভাল উদাহরণ (ডাইনামিক পলিমারফিজম / ডায়নামিক বাইন্ডিং) একটি ইন্টারফেস পলিমারফিজম এবং বিমূর্ততা প্রয়োগ করে do এটি কী করতে হবে তবে কীভাবে সংজ্ঞায়িত করা হয়েছে তা দ্বারা সংজ্ঞায়িত করা হয় প্রয়োগকারী ক্লাস। উদাহরণস্বরূপ।একটি গাড়ী সংস্থা এবং এটি চায় যে এটি যে গাড়ি তৈরি করছে তার জন্য কিছু বৈশিষ্ট্য সমান হতে পারে যার জন্য সংস্থাটি একটি ইন্টারফেস বাহন তৈরি করবে যাতে সেই বৈশিষ্ট্যগুলি থাকবে এবং বিভিন্ন শ্রেণীর গাড়ি (যেমন মারুটি সুজখি, মারুতি ৮০০) ওভাররাইড হবে সেই বৈশিষ্ট্যগুলি (ফাংশন)।
আমরা ইতিমধ্যে বিমূর্ত শ্রেণি আছে কেন ইন্টারফেস? জাভা কেবল বহুস্তর এবং স্তরক্রমিক উত্তরাধিকারকে সমর্থন করে তবে ইন্টারফেসের সাহায্যে আমরা একাধিক উত্তরাধিকার প্রয়োগ করতে পারি।
ব্যবহারিকতার শর্তে (জেভিএ), বিমূর্ত শ্রেণি এবং ইন্টারফেসের মধ্যে প্রধান পার্থক্যটি অ্যাবস্ট্রাক্ট শ্রেণি রাষ্ট্র ধরে রাখতে পারে। রাষ্ট্র হোল্ডিং ব্যতীত আমরা ইন্টারফেসের সাথে বিশ্রামের কাজগুলিও অর্জন করতে পারি।
একটি ইন্টারফেসে সমস্ত পদ্ধতি অবশ্যই সংজ্ঞা হতে হবে, একক নয় প্রয়োগ করা উচিত।
তবে একটি বিমূর্ত শ্রেণিতে কেবল সংজ্ঞা সহ একটি বিমূর্ত পদ্ধতি থাকতে হবে, তবে অন্যান্য পদ্ধতিগুলি বাস্তবায়নের সাথে সাথে বিমূর্ত শ্রেণিতেও হতে পারে ...
ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে আমাদের বিভিন্ন কাঠামোগত / সিনট্যাক্টিকাল পার্থক্য রয়েছে। আরও কিছু পার্থক্য রয়েছে
[1] পরিস্থিতি ভিত্তিক পার্থক্য :
অ্যাবস্ট্রাক্ট ক্লাসগুলি দৃশ্যে ব্যবহৃত হয় যখন আমরা ব্যবহারকারীকে পিতামাত্ত শ্রেণীর অবজেক্ট তৈরি করতে সীমাবদ্ধ রাখতে চাই এবং আমরা বিশ্বাস করি ভবিষ্যতে আরও বিমূর্ত পদ্ধতি যুক্ত হবে।
ইন্টারফেসটি ব্যবহার করতে হবে যখন আমরা নিশ্চিত থাকি যে আর কোনও বিমূর্ত পদ্ধতি সরবরাহ করা বাকি নেই। তারপরে কেবল একটি ইন্টারফেস প্রকাশিত হয়।
[২] ধারণাগত পার্থক্য :
"যদি ভবিষ্যতে আমাদের আরও বিমূর্ত পদ্ধতি সরবরাহ করতে হবে" যদি আপনি এটি বিমূর্ত শ্রেণি তৈরি করেন এবং যদি এটি ইন্টারফেস না করে।
(জাভা 1.7 অবধি সবচেয়ে উপযুক্ত এবং বৈধ)
সাধারণত আনুষঙ্গিক শ্রেণি পেরিফেরাল সংযোজন করার জন্য ব্যবহৃত হয় তবে কোনও কিছুর মূল অংশের জন্য ব্যবহৃত হয়।
আপনি যখন যানবাহনের জন্য বেস টাইপ তৈরি করতে চান তখন আপনাকে বিমূর্ত শ্রেণি ব্যবহার করা উচিত তবে আপনি যদি কিছু কার্যকারিতা বা সম্পত্তি যুক্ত করতে চান যা যানবাহনের বেস ধারণার অংশ নয় আপনার ইন্টারফেস ব্যবহার করা উচিত, উদাহরণস্বরূপ আপনি "ToJSON ()" ফাংশন যুক্ত করতে চান ।
ইন্টারফেসের বিমূর্ত শ্রেণীর চেয়ে বিমূর্ত বিস্তৃত থাকে। আপনি এটি পাস করার যুক্তিগুলিতে দেখতে পারেন this এই উদাহরণটি দেখুন:
আপনি যদি যুক্তি হিসাবে যানবাহন ব্যবহার করেন তবে আপনি কেবল তার উদ্ভূত প্রকারের একটি (বাস বা গাড়ি-একই বিভাগের জন্য কেবল যানবাহন বিভাগ) ব্যবহার করতে পারেন। কিন্তু আপনি যখন যুক্তি হিসাবে মুছনযোগ্য ইন্টারফেস ব্যবহার করেন তখন আপনার আরও পছন্দ থাকে।