|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
[PHP] Oggetti: chiarimenti su abstract e interfacce
Ho capito che ci possono essere classi e medodi di classi astratti.
Astrarre metodi in una classe serve a imporre al programmatore una loro implementazione specifica a seconda del caso qualora si voglia riutilizzare quella determinata classe. Giusto? Ma una classe astratta invece a che serve? Codice PHP:
Codice PHP:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 20-09-2010 alle 15:12. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Ovviamente sono ancora un po' confuso, se saprete aiutarmi a fare chiarezza ve ne sarò grato!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
allora una classe astratta ti serve per definire una sorta di tassonomia delle tue classi, in questa maniera hai il vantaggio di definire particolari proprietà comuni ed inoltre sfrutti il principio d'inclusione proprio della programmazione OO: metodi che lavorano su tale classe astratta accetteranno per poliformismo anche istanze di classi derivate.. (una istanza di classe B che estende una classe A è (anche) una istanza di classe A)
le interfacce invece si utilizzano proprio per quello che tu giustamente dici, a garantire particolari vincoli e che particolari metodi siano implementati e anche esattamente per tutti quei linguaggi in cui la ereditarietà multipla non è (giustamente) supportata (vedi Java) ma la implementazione multipla si. Possiamo anche dire, in altre parole, che un' interfaccia è una classe astratta in cui tutti i metodi siano astratti e che non dispone di attributi non inizializzati
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum |
|
|
|
|
|
#4 |
|
Messaggi: n/a
|
Direi che cdere ha spiegato molto bene i concetti.
Anch'io avevo poco chiara l'utilità delle interfacce finchè in un progetto recente in Java (J2EE) non ho avuto a che fare con "service layer" e "Dao layer". |
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
Quote:
Bhè le differenze ci sono e sono conseguenze dirette dei concetti stessi di ereditarietà e implementazione. Un'interfaccia specifica solo quali servizi una classe (o un'altra interfaccia) che implementa tale interfaccia DEVE implementare ed esportare (nell'implementazione di interfaccia la visibilità degli attributi/metodi deve rimanere invariata). Quindi una classe A può implementare le interfacce B e C, quindi l'interfaccia di A esporrà sicuramente i servizi di B, sicuramente i servizi di C e, se ce ne sono, i servizi di A stessa. Questo è possibile perchè comunque non può esserci un conflitto d'implementazione, nel caso di ereditarietà multipla infatti se B dispone di un metodo stampa() che stampa: "ciao", e C dispone di un metodo stampa() che stampa "addio", se A ereditasse sia da B che da C (caso possibile in C++) e un oggetto istanza di A invocherebbe stampa() che stringa verrebbe stampata? E' bene non confondere i due concetti di ereditarietà e di interfaccia, ad una prima occhiata superficiale potrebbero sembrare molto simili, ma sono semanticamente 2 mondi opposti
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum |
|
|
|
|
|
|
#8 | |||
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Rieccomi a tornare sull'argomento restato in sospeso, sperando di chiarimi le idee una volta per tutte.
Riprendo il primo 3D da Quote:
Quote:
Quindi (io per capire devo andare terra terra con degli esempi esaustivi) è il caso di una fantomatica classe "FiguraGeometrica" che ha i metodi "Perimetro" e "Area" astratti perchè le classi "Triangolo" e "Cerchio" che la estenderanno andranno a definire specificatamente gli algoritmi corretti per quelle figure in quei metodi? Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 27-09-2010 alle 17:48. |
|||
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 20-09-2010 alle 15:46. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Spero che tu abbia conservato l'intuizione originale (hey, 'ste due cose mi sembrano la stessa) perchè è quella corretta.
La spiegazione non è complicata ma, direi, articolata. In verità è tripartita. Occorrerebbe in effetti fare un discorso storico, uno che riguarda gli effetti "meccanici", ed uno teorico. La storia ci direbbe perchè esistono linguaggi che hanno le interfacce e linguaggi che hanno le classi astratte e fino a che punto coincidono. L'effetto riguarderebbe il risvolto pratico dell'uso di una classe astratta rispetto ad un'interfaccia: una volta che le hai fatte, ci sono cose che puoi fare con una che non puoi fare con l'altra e viceversa. La teoria, dell'orientamento agli oggetti. Ci dice invece quando scegli usare una classe astratta o un'interfaccia rispetto ad una classe non astratta. Il problema è che la terza è strana senza le altre due. Direi quasi sorprendente, basti citare il fatto che nessuno dei concetti di classe astratta, interfaccia o ereditarietà è autonomo rispetto ai fondamenti dell'orientamento agli oggetti (i primi due sono casi di definizioni, il secondo è una forma di composizione). Quindi, se vuoi essere lungamente annoiato, fai un fischio. Ti avviso però che l'entità del polpettone da buttar giù è considerevole.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Non per niente il titolo è "[php] Oggetti: chiarimenti su abstract e interfacce" Piccola parentesi "multi ereditarietà" se pure Microzoz con C# ripiega dalla multi ereditarietà del C++ verso la multi implementazione un motivo ci sarà!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 20-09-2010 alle 18:20. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Mah, è difficile [compiere l'impresa] evitando di comporre un elenco telefonico [mentr]e mischiando tutto si rischia il classico frittatone dove a guardar bene non si dice un bel nulla. Vediamo cosa salta fuori cercando di limitare le chiacchiere.
E' noto che classi, astratte o no, e interfacce, non siano affatto espressione di mondi totalmente opposti. Esprimono invece due punti di vista di cui uno è l'ampliamento dell'altro. Prospettiva storica. Interfaccia = ereditarietà scandinava = i genitori passano ai figli la dichiarazione delle proprie caratterestiche, non la definizione: se papà è giallo, figlio ha un colore, quale spetta a lui dirlo. Classe = ereditarietà americana = estensione = i genitori passano ai figli la dichiarazione e la definizione, se presente: se papà è colorato, figlio è colorato. Se papà è giallo (cioè colorato di giallo) figlio è giallo. La ragion d'essere delle classi astratte sta nell'estesione, che è una "ereditarietà (scandinava) PIU' qualcos'altro", cioè la definizione. E' chiaro che se posso mischiare qualcosa che è dichiarato e definito a qualcosa che è solo dichiarato, il recipiente dove mescolo non possa essere che astratto: gli manca un pezzo per essere compiuto. Il perchè dell'estensione, cioè perchè prendiamo il concetto di ereditarietà ovvero la trasmissione di un insieme di dichiarazioni e gli ficchiamo dentro anche l'eventualità che il trasporto includa una definizione, è pratico: perchè così possiamo riciclare il codice delle funzioni dichiarate nel supertipo. E' comodo, molto comodo, abbastanza da chiedersi "se è così comodo, come mai gli scandinavi, che non erano fessi, non la volevano"? La conseguenza della risposta è il "diamante". La risposta è: tutti i casi di ereditarietà come trasmissione della dichiarazione di un predicato dal genitore al figlio sono definiti, non tutti i casi di ereditarietà (estensione) come trasmissione della dichiarazione e della definizione di un predicato dal genitore al figlio sono definiti e, precisamente, non sono definiti i casi in cui i genitori condividano la definizione di uno stesso predicato. Mamma gialla, papà blu. 1) Figlio (ereditarietà scandinava): colorato 2) Figlio (estensione o ereditarietà americana): ??? Il caso 2 ha tre soluzioni, le ometto per brevità. Questa è la storia malamente raccontata delle classi astratte. Esistono per via della definizione ante litteram di ereditarietà e della divergenza tra le due scuole citate. La genesi spiega una marea di cose. Ad esempio come mai la massima estensione del concetto di classe astratta coincida con quello di interfaccia. Se quaglia e non ci sono dubbi, domande o curiosità, passiamo alla questione meccanica. Quaglia?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! Ultima modifica di PGI-Bis : 20-09-2010 alle 18:52. Motivo: virgole a spaglio e qualche congiunzione... |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Chiaro chiaro no, stasera dopo cena spulcio.
Piccolo , voi per caso avete idea di perchè nei miei esempi ho trovato come nome di funzione FooBar? Significa qualcosa in particolare?
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
foo e bar/baz sono nomi d'esempio. FooBar è un mix dei due. Non ha significato.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
L'ereditarieta' serve per modellare relazioni di tipo "Is Of"
mentre l'implementazione per modellare relazioni di tipo "Can Do"
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
più che altro Must Do...
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
L'ereditarietà serve per consentire a due pezzi di un programma di scambiarsi dati senza che ciò comporti un vincolo tra le loro definizioni.
E', cioè, una forma di composizione tra definizioni in forza della quale due oggetti (definizioni non incluse in altre definizioni, definizione = insieme nominato di predicati) condividono una stessa parte (definizione inclusa) So che suona strana detta così ma è solo per i termini perchè il fenomeno che ci sta dietro è arcinoto e chiunque usi un linguaggio OO lo riproduce in continuazione. E' il "separare l'interfaccia dall'implementazione", il "disaccoppiare", direi quasi anche la depency injection - ma con le pinze, non ho approfondito la questione. C'è sempre, se ci fate caso, l'ereditarietà di mezzo. E c'è un motivo: senza il collegamento dinamico tra due tipi di dato, tra due definizion, non è possibile realizzare un sistema composto di oggetti, cioè di cose che collaborano senza perdere la propria identità. Il fatto che sia una necessità è importante perchè se ci limitiamo a dire che serve quando vuoi dire "è un" viene da chiedersi: e qual'è la regola in base alla quale decido chi è cosa?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Sicuramente avrò capito male, ma ho capito così:
![]() Quote:
... e al post #8 avevo capito bene?
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 27-09-2010 alle 17:48. |
|
|
|
|
|
|
#19 | |||
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Quote:
Quote:
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|||
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Una volta, da qualche parte, lessi che la programmazione ad oggetti si basa sulle 3 fondamenta seguenti.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 27-09-2010 alle 18:43. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:25.












, voi per caso avete idea di perchè nei miei esempi ho trovato come nome di funzione FooBar? Significa qualcosa in particolare?









