Trochę się wahałem z zadaniem tego pytania, ale kij tam, najwyżej zostanę okrzyknięty idiotą. :p
Hej!
Przez ostatnie 2 dni zastanawiam się nad użytecznością klas abstrakcyjnych (w php, bo nie wiem jak sprawa ma się u innych).
Przejdźmy do kodu:
namespace Sharpness;
abstract class AbstractSharpness
{
protected $sides;
protected $radius;
public function __construct($sides = 0, $radius = 0) // Ustawiłem na 0, aby nie implementować obsługi błędów, która w tym przykładzie nam się nie przyda.
{
$this->sides = $sides;
$this->radius = $radius;
}
abstract function getSides();
abstract function getRadius();
}
Aby było spójnie podam przykładową klasę która jest rozszerzalna o tą abstrakcyjną:
namespace Sharpness;
class Square extends AbstractSharpness
{
public function getSides()
{
return $this->sides;
}
public function getRadius()
{
return $this->radius * $this->radius;
}
}
Wywołujemy ten kod za pomocą:
$sharpness = new Sharpness\Square(2, 3);
print $sharpness->getSides(); // zwraca: 2
print $sharpness->getRadius(); // zwraca: 9
No, fajnie, tylko... Takowy kod jest mniej czytelny zrozumiały niżeli w przypadku zastosowania set i get:
$sharpness = new Sharpness\Square();
$sharpness->setSides(2);
print $sharpness->getSides(); // zwraca: 2
$sharpness->setRadius(3);
print $sharpness->getRadius(); // zwraca: 9
Ale w takim przypadku abstrakcja jest zbędna (Każdy przykład, jaki dotychczas widziałem, próbując załapać po co nam abstrakcja, dało się zamienić na takowy).
Oglądałem wczoraj jakieś spotkanie phpersów, tam był przykład czegoś podobnego, z wykorzystaniem seterów oraz jeden z __construct(); gość stwierdził(Ja tak zrozumiałem), że również jest za nimi(set'terami i get'terami), gdyż tego, jak to podsumował: „Nie da się spierdo***”.
No bo tak wiemy i widzimy co setujemy, a w takim __construct() to trza zajrzeć do klasy abstrakcyjnej aby się połapać.
Jak będziemy chcieli wymusić jakąś metodę, która ma się znajdować w „podklasie”, to przecież zastosujemy interface.
Będzie ktoś na tyle miły aby mi wytłumaczyć gdzie takowe abstrakcje będą użyteczne?