PHP-তে OOP-তে ইন্টারফেসের প্রয়োগ
সুতরাং, আমরা ইতিমধ্যেই জেনেছি যে ইন্টারফেসগুলি একটি ভালো উপায় ক্লাসের সমস্ত প্রয়োজনীয় পদ্ধতি বাস্তবায়িত হয়েছে কিনা তা নিয়ন্ত্রণ করার।
আসুন আরও একটি, আরও ব্যবহারিক, উদাহরণ দেখি। ধরা যাক আমাদের কাছে একটি ক্লাস আছে যা এর মধ্যে অবজেক্ট-আকৃতির একটি অ্যারে সংরক্ষণ করবে:
<?php
class FiguresCollection
{
private $figures = []; // আকৃতির জন্য অ্যারে
}
?>
আমাদের ক্লাসে অবজেক্ট যোগ করার জন্য addFigure পদ্ধতি
বাস্তবায়ন করি:
<?php
class FiguresCollection
{
private $figures = [];
// প্যারামিটার হিসাবে একটি আকৃতির অবজেক্ট পাস করা হয়:
public function addFigure($figure)
{
$this->figures[] = $figure;
}
}
?>
স্পষ্টতই, আমরা আশা করি যে
addFigure পদ্ধতির প্যারামিটার হিসাবে
একটি আকৃতির অবজেক্ট পাঠানো হবে। যাইহোক, এর
কোনো নিয়ন্ত্রণ নেই!
আসুন টাইপের জন্য টাইপ হিন্ট ব্যবহার করি এবং
স্পষ্টভাবে অবজেক্টের টাইপ Figure হিসাবে উল্লেখ করি:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
}
?>
আমরা কি করেছি তা বুঝে নেওয়া যাক।
যদি Figure একটি বাস্তব বিদ্যমান ক্লাস হত,
তাহলে আমরা পদ্ধতির প্যারামিটারে এই ক্লাসের অবজেক্টগুলি, এবং এটির
উত্তরাধিকারীদেরও পাঠাতে পারতাম।
যাইহোক, আমাদের ক্ষেত্রে, Figure একটি ইন্টারফেস।
সেক্ষেত্রে টাইপ হিন্টটি বোঝায় যে
পদ্ধতির প্যারামিটার হিসাবে শুধুমাত্র সেইসব ক্লাসের অবজেক্ট পাঠানো যেতে পারে
যারা আমাদের ইন্টারফেস বাস্তবায়ন করে।
আসুন আমাদের ক্লাসের একটি অবজেক্ট তৈরি করার চেষ্টা করি এবং এতে আকৃতি যোগ করি:
<?php
$figuresCollection = new FiguresCollection;
// একজোড়া বর্গক্ষেত্র যোগ করি:
$figuresCollection->add(new Quadrate(2));
$figuresCollection->add(new Quadrate(3));
// একজোড়া আয়তক্ষেত্র যোগ করি:
$figuresCollection->add(new Rectangle(2, 3));
$figuresCollection->add(new Rectangle(3, 4));
?>
অন্য কোন ক্লাসের একটি অবজেক্ট যোগ করার চেষ্টা ত্রুটির কারণ হবে:
<?php
$figuresCollection = new FiguresCollection;
class Test {}; // অন্য কিছু ক্লাস
$figuresCollection->add(new Test); // ত্রুটি দেবে
?>
অনুশীলনে এই নিয়ন্ত্রণ আমাদের কী দেয়:
যেহেতু কালেকশনে যোগ করা সমস্ত আকৃতি
Figure ইন্টারফেস বাস্তবায়ন করে, আমরা
নিশ্চিত হতে পারি যে তাদের প্রত্যেকের কাছে getSquare পদ্ধতি
এবং getPerimeter পদ্ধতি থাকবে।
ভবিষ্যতে বর্গক্ষেত্র এবং আয়তক্ষেত্র ছাড়াও
উদাহরণস্বরূপ, একটি ত্রিভুজও দেখা দিতে পারে।
এই ক্ষেত্রে ত্রিভুজেরও getSquare এবং
getPerimeter পদ্ধতি থাকবে।
অনুশীলনে এটি আমাদের নিম্নলিখিতটি দেয়: আমরা
FiguresCollection ক্লাসে করতে পারি,
উদাহরণস্বরূপ, getTotalSquare পদ্ধতি, যা
কালেকশনের আকৃতির মোট ক্ষেত্রফল খুঁজে পায়। এই পদ্ধতিতে
আমরা আকৃতির অ্যারেটি লুপ করে পুনরাবৃত্তি করব এবং
প্রতিটি আকৃতিতে getSquare পদ্ধতি কল করব।
যেহেতু প্রতিটি আকৃতি Figure ইন্টারফেস
বাস্তবায়ন করে, আমরা 100% নিশ্চিত হতে পারি
যে প্রতিটি আকৃতিতে এই getSquare পদ্ধতি
থাকবে।
সুতরাং, পদ্ধতির বাস্তবায়ন এখানে:
<?php
class FiguresCollection
{
private $figures = [];
public function addFigure(Figure $figure)
{
$this->figures[] = $figure;
}
// মোট ক্ষেত্রফল বের করি:
public function getTotalSquare()
{
$sum = 0;
foreach ($this->figures as $figure) {
$sum += $figure->getSquare(); // getSquare পদ্ধতি ব্যবহার করি
}
return $sum;
}
}
?>
আমার কোড না দেখেই একই রকম
FiguresCollection ক্লাস বাস্তবায়ন করুন।
FiguresCollection ক্লাসে
getTotalPerimeter পদ্ধতি যোগ করুন সমস্ত আকৃতির
সর্বমোট পরিসীমা বের করার জন্য।