l'idea di oronze era giusta ma scritta male, quella di philbert direi che sia scritta giusta ma logicamente errata, nel senso:
si può pensare che l'alfabeto sia un insieme di lettere, quindi le lettere non sono una estensione dell'alfabeto, ma un oggetto che alfabeto possiede per comporsi. Quindi la soluzione sarebbe stata
Codice PHP:
class Alfabeto{
private $data = array();
public function __construct(){
$this->data[] = new A();
$this->data[] = new B();
//etc...
}
public function elenco(){
foreach($this->data as $lettera)
echo $lettera->stampa();
}
public function add(Lettera $lettera){
$this->data[] = $lettera;
}
}
interface Lettera {
public function stampa();
}
class A implements Lettera {
public function stampa() {
echo "A";
}
}
class B implements Lettera {
public function stampa() {
echo "B";
}
}
notare la funzione Alfabeto::add : l'uso dell'interfaccia delle lettera permette di essere sicuri che l'oggetto passato ad alfabeto sia conosciuto come tipo, ma non specificato nel sottotipo, che non interessa al programma..altrimenti per ogni A,B,..Z avresti dovuto fare un metodo addX col tipo di classe specifico (questo a far i pignoli in oop)
dire che una lettera è un'estensione dell'alfabeto... sinceramente non l'ho capita, non riesco a farne un esempio. E' cmq buona norma evitare, se non strettamente necessario, di far estendere classi se si può utilizzare invece un'interfaccia: se tu estendi una classe, non potrai estenderne un'altra, se tu implementi un'interfaccia, ne potrai sempre implementare altre e volendo estendere una classe
puoi pure pensare ad una soluzione:
Codice PHP:
abstract class Lettera{
abstract protected function getLettera();
public function stampa(){
echo $this->getLettera();
}
}
class A extends Lettera{
protected function getLettera(){ return 'A'; }
}
class B extends Lettera{
protected function getLettera(){ return 'B'; }
}
class Alfabeto{
private $lettere = array();
public function add(Lettera $lettera){
$this->lettere[] = $lettera;
}
public function elenco(){
foreach($this->$lettere as $lettera)
echo $lettera->stampa();
}
}
$alfabeto = new Alfabeto();
$alfabeto->add(new A());
$alfabeto->add(new B());
$alfabeto->elenco();
tutto sta nel capire Lettera,A,B,Alfabeto cosa debbano effettivamente essere e cosa debbano effettivamente fare, visto che non c'è il pattern giusto a priori