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 අන්තර්මුඛය ක්රියාත්මක කරන බැවින්, එක් එක් ආකෘතියට මෙම <getSquare ක්රමය ඇති බව ගැන අපට <100% විශ්වාසයක් ඇත.
ඉතින්, ක්රමයේ ක්රියාත්මක කිරීම මෙන්න:
<?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 ක්රමය එක් කරන්න.