যদি ইতিমধ্যে বিমূর্ত ক্লাস থাকে তবে আপনার কেন একটি ইন্টারফেসের প্রয়োজন হবে?
একাধিক উত্তরাধিকার রোধ করতে (একাধিক জ্ঞাত সমস্যা দেখা দিতে পারে)।
এরকম একটি সমস্যা:
"হীরা সমস্যা" (কখনও কখনও "মৃত্যুর মারাত্মক হীরা" হিসাবে পরিচিত) হ'ল একটি দ্ব্যর্থতা যা তখন উত্থিত হয় যখন দুটি শ্রেণি বি এবং সি এ থেকে উত্তীর্ণ হয় এবং বর্গ ডি এবং বি থেকে উভয়ই উত্তরাধিকার সূত্রে প্রাপ্ত হয় যদি এ-তে কোনও পদ্ধতি থাকে তবে বি এবং সি ওভাররাইড করেছে এবং ডি এটিকে ওভাররাইড করে না, তারপরে ডি পদ্ধতির কোন সংস্করণটি উত্তরাধিকার সূত্রে পাওয়া যায়: বি এর, না সি?
সূত্র: https://en.wikedia.org/wiki/ মাল্টিপল_হিরিট্যান্স# দ্য_ডাইমন্ড_প্রব্লেম
কেন / কখন একটি ইন্টারফেস ব্যবহার করবেন?
একটি উদাহরণ ... বিশ্বের সমস্ত গাড়ির একই ইন্টারফেস (পদ্ধতি) ... AccelerationPedalIsOnTheRight()
, BrakePedalISOnTheLeft()
। কল্পনা করুন যে প্রতিটি গাড়ির ব্র্যান্ডের এই "পদ্ধতিগুলি" অন্য ব্র্যান্ডের থেকে আলাদা হবে। বিএমডাব্লুটির ডানদিকে ব্রেকগুলি ছিল, এবং হন্ডার চাকাটির বাম দিকে ব্রেক থাকবে। লোকেরা শিখতে হবে যে এই "পদ্ধতিগুলি" কীভাবে প্রতিবার তারা বিভিন্ন ব্র্যান্ডের গাড়ি কিনবে তা কাজ করে। একারণে একাধিক "জায়গাগুলিতে" একই ইন্টারফেস থাকা ভাল ধারণা।
একটি ইন্টারফেস আপনার জন্য কী করে (কেন কেউ কেউ এটি ব্যবহার করবে)? একটি ইন্টারফেস আপনাকে "ভুল" করতে বাধা দেয় (এটি আপনাকে আশ্বাস দেয় যে একটি নির্দিষ্ট ইন্টারফেস প্রয়োগকারী সমস্ত শ্রেণীর ইন্টারফেসে থাকা সমস্ত পদ্ধতি থাকবে)।
// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{
public function Create($personObject);
}
class MySqlPerson implements IPersonService
{
public function Create($personObject)
{
// Create a new person in MySql database.
}
}
class MongoPerson implements IPersonService
{
public function Create($personObject)
{
// Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
}
}
এই Create()
পদ্ধতিটি সর্বদা একইভাবে ব্যবহৃত হবে। আমরা MySqlPerson
ক্লাস বা ক্লাস ব্যবহার করছি তা MongoPerson
বিবেচ্য নয়। আমরা কীভাবে কোনও পদ্ধতি ব্যবহার করছি তা একই থাকে (ইন্টারফেসটি একই থাকে)।
উদাহরণস্বরূপ, এটি এর মতো ব্যবহার করা হবে (আমাদের কোডের যে কোনও জায়গায়):
new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
এইভাবে, এরকম কিছু ঘটতে পারে না:
new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);
একটি ইন্টারফেস মনে রাখা এবং একাধিক বিভিন্নগুলির চেয়ে সর্বত্র একই ব্যবহার করা অনেক সহজ।
এই পদ্ধতিতে, Create()
"বাইরের" কোডকে প্রভাবিত না করে পদ্ধতির অভ্যন্তর বিভিন্ন শ্রেণীর জন্য আলাদা হতে পারে, যা এই পদ্ধতিটিকে কল করে। বাইরের সমস্ত কোডটি জানতে হবে যে পদ্ধতিটির Create()
1 টি প্যারামিটার ( $personObject
) রয়েছে, কারণ বাইরের কোডটি এই পদ্ধতিটি ব্যবহার / কল করবে। বাইরের কোডটি পদ্ধতির ভিতরে কী ঘটছে সেদিকে খেয়াল রাখে না; এটি কেবল কীভাবে ব্যবহার করতে / কল করতে হবে তা জানতে হবে।
আপনি ইন্টারফেস ছাড়াও এটি করতে পারেন, তবে আপনি যদি কোনও ইন্টারফেস ব্যবহার করেন তবে এটি "নিরাপদ" (কারণ এটি আপনাকে ভুল করতে বাধা দেয়)। ইন্টারফেস আপনাকে আশ্বাস দেয় যে পদ্ধতিটিতে Create()
ইন্টারফেস প্রয়োগকারী সমস্ত শ্রেণিতে একই স্বাক্ষর (একই ধরণের এবং একই সংখ্যক পরামিতি) থাকবে। এইভাবে আপনি নিশ্চিত হতে পারেন যে কোনও শ্রেণি যা IPersonService
ইন্টারফেসটি প্রয়োগ করে , তার পদ্ধতি থাকবে Create()
(এই উদাহরণে) এবং কল করতে $personObject
/ ব্যবহার করতে কেবলমাত্র 1 টি প্যারামিটারের প্রয়োজন হবে ।
একটি শ্রেণি যা ইন্টারফেস প্রয়োগ করে তার অবশ্যই সমস্ত পদ্ধতি প্রয়োগ করতে হবে, যা ইন্টারফেসটি / করে।
আমি আশা করি আমি নিজেকে খুব বেশি পুনরাবৃত্তি করিনি।