|
|
|
![]() |
|
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: 18:03.