|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
[Programmazione OO] Chiarimento su uso di Interfaccie e Classi Astratte
Ciao,
vorrei chiedervi un chiarimento circa l'uso combinato di interfaccie e classi astratte e della relativa buona progettazione di un'applicazione in una situazione tipo questa. Allora...ho un interfaccia che mi rappresenta i metodi pubblici comuni a 2 classi che la implementano (appunto l'interfaccia con l'esterno di tali classi) e poi ho le due classi Classe1 e Classe2 che implementano tale interfaccia, implementando in modo diverso i metodi pubblici dichiarati nell'interfaccia. Una cosa del genere (l'esempio è scritto in pseudo PHP ma credo che il linguaggio sia indifferente...): Codice:
<?php
interface Interfaccia{
public function metodoPubblico1();
public function metodoPubblico2();
public function metodoPubblico3();
}
class Classe1 implements Interfaccia{
// PROPRIETÀ COMUNI A TUTTE LE IMPLEMENTAZIONI DI Interfaccia:
private $a = 10;
private $b = 20;
// PROPRIETÀ SPECIFICA PER L'IMPLEMENTAZIONE Classe1:
private $c = "classe1";
private metodoAusiliario1(){
// CORPO METODO
}
private metodoAusiliario2(){
// CORPO METODO
}
/* IMPLEMENTAZIONE DEI METODI PUBBLICI PER Classe1
* DICHIARATI NELL'INTERFACCIA: */
public function metodoPubblico1(){
// CORPO METODO
}
public function metodoPubblico2(){
// CORPO METODO
}
public function metodoPubblico3(){
// CORPO METODO
}
}
class Classe2 implements Interfaccia{
// PROPRIETÀ COMUNI A TUTTE LE IMPLEMENTAZIONI DI Interfaccia:
private $a = 10;
private $b = 20;
// PROPRIETÀ SPECIFICA PER L'IMPLEMENTAZIONE Classe2:
private $c = "classe2";
private metodoAusiliario1(){
// CORPO METODO
}
private metodoAusiliario2(){
// CORPO METODO
}
/* IMPLEMENTAZIONE DEI METODI PUBBLICI PER Classe2
* DICHIARATI NELL'INTERFACCIA: */
public function metodoPubblico1(){
// CORPO METODO
}
public function metodoPubblico2(){
// CORPO METODO
}
public function metodoPubblico3(){
// CORPO METODO
}
}
?>
Può essere una cosa intelligente (di buona progettazione fare una cosa del genere). Mantengo l'interfaccia, creo una nuova classe astratta che chiamo ComportamentoComune che contiene semplicemente le 2 proprietà comuni ($a e $b) ed i vecchi metodi privati che hanno la stessa implementazione in Classe1 e Classe2...solo che...ora invece di essere privati li dichiaro come protected. Tale classe astratta implementa l'interfaccia. Infine creo Classe1 e Classe2 che estendono la classe astratta ComportamentoComune implementando di fatto solo i metodi pubblici dichiarati nell'interfaccia, le proprietà specifiche ed eventuali specifici metodi private per quella particolare implementazione... L'esempio di prima diventerebbe una cosa del genere insomma: Codice:
<?php
interface Interfaccia{
public function metodoPubblico1();
public function metodoPubblico2();
public function metodoPubblico3();
}
abstract class ComportamentoComune implements Interfaccia{
// PROPRIETÀ COMUNI A TUTTE LE IMPLEMENTAZIONI DELL'INTERFACCIA:
protected $a = 10;
protected $b = 10;
// METODI AUSILIARI COMUNI A TUTTE LE IMPLEMENTAZIONI DELL'INTERFACCIA:
private metodoAusiliario1(){
// CORPO METODO
}
private metodoAusiliario2(){
// CORPO METODO
}
}
class Classe1 extends CompostamentoComune{
// PROPRIETÀ SPECIFICA PER L'IMPLEMENTAZIONE Classe1:
private $c = "classe1";
/* IMPLEMENTAZIONE DEI METODI PUBBLICI PER Classe1
* DICHIARATI NELL'INTERFACCIA: */
public function metodoPubblico1(){
// CORPO METODO
}
public function metodoPubblico2(){
// CORPO METODO
}
public function metodoPubblico3(){
// CORPO METODO
}
}
class Classe2 extends CompostamentoComune{
// PROPRIETÀ SPECIFICA PER L'IMPLEMENTAZIONE Classe2:
private $c = "classe2";
/* IMPLEMENTAZIONE DEI METODI PUBBLICI PER Classe2
* DICHIARATI NELL'INTERFACCIA: */
public function metodoPubblico1(){
// CORPO METODO
}
public function metodoPubblico2(){
// CORPO METODO
}
public function metodoPubblico3(){
// CORPO METODO
}
}
?>
Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Qui la questione non è tanto di orientamento agli oggetti quanto di comunicazione.
In generale evitare ripetizioni nel codice di un programma è corretto nello stesso senso in cui è corretto farlo nella comunicazione in linguaggi naturali. La ripetizione è un errore, evitarla non è "intelligente" o "buona progettazione" ma semplicemente corretto. Dunque la prima implementazione è sbagliata - perchè conduce ad una ripetizione - la seconda è corretta - perchè non comporta quella ripetizione.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Beh, direi di sì: certo sei tu che giudichi se il gioco vale la candela, nel contesto della soluzione che stai implementando.
Nel forum c'è una vecchia discussione circa le classi astratte e la loro semantica nel contesto della programmazione orientata agli oggetti; non so se l'hai già letta, te la linko: [C++] Quando usare una classe astratta ?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:21.



















