- Home
- Categorie
- Coding e Sistemistica
- Coding
- interfacce con funzioni astratte non si può ?
-
interfacce con funzioni astratte non si può ?
Salve a tutti da poco ho scoperto finalmente come affontare la programmazione OOP col PHP .... l'incapslazione del codice l'ereditarietà son cose assai belle !!!
Però non riesco a capire come mai ... succede ciò:
interface pippo { abstract function clicca(); }
mi restituise un
FATAL ERROR:Access type for interface method pippo::clicca must be omitted in (file_x) line_yyyP.S.
Se da astratta (abstract) la rendo public tutto fila liscio ... ma nn vedo le classi che implementano l'interfaccia costrette a quella funzione (clicca) !!!tnks all
-
Ciao,
i metodi di un'interfaccia sono sempre astratti e non devi specificare "abstract" nella dichiarazione dei metodi.
Inoltre non è necessario neanche definire l'accesso "public".Nelle classi che implementano l'interfaccia vanno poi definiti i metodi dichiarati nell'interfaccia, se ne dimentichi anche solo uno viene generato il relativo errore. Di fatto sono "costrette a quella funzione".
Alessandro
-
Ciao,
i metodi di un'interfaccia sono sempre astratti e non devi specificare "abstract" nella dichiarazione dei metodi.
Inoltre non è necessario neanche definire l'accesso "public".Ok, ricevuto
Nelle classi che implementano l'interfaccia vanno poi definiti i metodi dichiarati nell'interfaccia, se ne dimentichi anche solo uno viene generato il relativo errore. Di fatto sono "costrette a quella funzione".
Qui ci stò rimbambendo da giorni l'interfaccia viene implementata da una classe madre astratta.... ora proprio per testare quello che mi hai scritto tu > ... se ne dimentichi anche solo uno viene generato il relativo errore ho commentato la funzione nella classe madre .... tutto continua a filare liscio
nessun errore ... cosa sarà ?!?!
grazie mille
-
Ciao,
oggi sono un pò fuso per il lavoro... puoi postare il codice così mi è più chiaro cosa stai provando? Grazie
-
Ti fonderei ancora di +
non è tanta roba te la riassumo a modo mio:
interface.pippo.php {function validate();}
class.propertyObject.php
abstract class propertyObject implements pippo
la funzione validate la commento //class.Entity.php
abstract class Entity extends propertyObject
la funzione validate() con codice funziona ma nessuno mi castiga per aver saltato la classe madre propertyObject :bho:thanks
-
Questo avviene perchè la classe è astratta e il metodo dell'interfaccia (astratto per definizione) viene considerato tale e non hai l'obbligo di definirlo.
Finchè non estendi la classe in una classe non-astratta, non ti viene imposto l'obbligo di definire il metodo dichiarato nell'interfaccia.Alessandro
-
grande Alessandro !!!! Hai salvato 1 anima in pena
x
Già che ci sono .... cosa mi consiglieresti per gestire i messaggi di ALERT o WARNING formato html (div)
Una classe contenente tante costanti
es. $warning='<div class="warn">Attenzione dati mancanti</div>';O una interfaccia ? (Che non ho ancora capito a cacchio serva bah ...)
Grazie ancora per la tua disponiilità
-
Ciao,
se gli ALERT/WARNING sono generirici come quello che hai messo di esempio e sono prevedi che siano gli stessi per varie classi, ti consiglio di metterli come attributi costanti in un'interfaccia.Una classe può estendere una sola classe "madre" per volta e di conseguenza ereditare attributi e metodi in forma gerarchica. Non puoi avere una classe che eredita attributi e metodi di due altre classi che a loro volta non siano una l'estensione dell'altra.
Le interfacce servono proprio per andare oltre questo limite e permetterti di assegnare (implementare) a più classi un insieme di attributi (costanti) e metodi comuni (metodi astratti).Alessandro
-
Grazie mille Ale, ora ho + chiaro il concetto. Se ho capito bene, potrei fare un interface.Alert.php ed un interface.Warning.php con all'interno :
function BadLogin()
{
return '<div class="wrn">Login Errato</div>';
}se queste 2 interfacce le implemento ovunque sarei a 'cavallo' ?
Byez
-
No, quello sarebbe un codice errato.
L'interfaccia contiene le dichiarazioni dei metodi, ma non le definizioni. Non puoi definire il metodo BadLogin all'interno dell'interfaccia.Nel tuo esempio un uso possibile potrebbe essere questo:
[php]
interface Warning
{
function BadLogin();
}class Utente implements Warning
{
function BadLogin()
{
return '<div class="wrn">Login utente errato</div>';
}
}class Admin implements Warning
{
function BadLogin()
{
return '<div class="wrn">Login admin errato</div>';
}
}[/php]
In questo modo implementi i metodi dell'interfaccia personalizzandoli classe per classe.
Se non intendi personalizzarli, ma lasciarli generici, puoi utilizzare gli attributi costanti nell'interfaccia:
[php]
interface Warning
{
const BadLogin='<div class="wrn">Login utente errato</div>';
}class Utente implements Warning
{
function Login()
{
....
if ($Login_Errato) return self::BadLogin;
}
}class Admin implements Warning
{
function Login()
{
....
if ($Login_Errato) return self::BadLogin;
}
}
[/php]Alessandro