Domanda:
domanda sull'uso delle interfacce in java.?
anonymous
2015-01-07 03:31:35 UTC
poniamo che io abbia definito un'interfaccia A e una classe B che la implementa e fa altro. Mi serve che un oggetto di tipo B sia istanziato in una classe C ed usato in qualche modo.
In C io devo create un oggetto interfaccia A e castarlo con B oppure posso direttamente creare B ?
Io ho capito che un'interfaccia è un contratto, voglio delle funzionalità minime e garantite affinché B possa definirsi un oggetto come A. Però la domanda mi sorge perché sul lato pratico, istanziando l'interfaccia A come = new B(); poi non posso accedere alle variabili di B né a metodi che non siano quelli previsti dall'interfaccia.
Cinque risposte:
?
2015-01-07 07:46:15 UTC
Non basta utilizzare le interfacce per poter avere un buon design, è necessario invece rispettare diversi principi (più che altro S.O.L.I.D), conoscere i design patterns, quelli architetturali (come la clean architecture di Uncle Bob) etc etc.



Le interfacce posso contenere solo metodi, se tu dici "Animale gatto = new Gatto()", stai dicendo che l'oggetto "gatto" è di tipo Animale, per cui ti ritroverai solo i metodi dell'interfaccia Animale, come è giusto che sia. Se vuoi accedere alle variabili di Gatto allora crea un oggetto di tipo Gatto, non c'è nulla di sbagliato in questo, ma devi essere consapevole del vincolo che stai imponendo all'oggetto, cioè lo stai vincolando ad una specifica classe concreta e in determinati casi questo sarebbe sbagliato. Dipende sempre da quello che devi fare... l'importante è essere sempre consapevoli dell'impatto che può avere (anche in futuro) una determinata scelta.
nicoladc89
2015-01-07 07:20:04 UTC
Diciamo che avere un'interfaccia per poi avere una sola classe che la implementa è decisamente inutile. Le interfacce servono per definire il comportamento di una categoria di classi. Nel tuo esempio, l'interfaccia Animale, può essere implementata da Gatto, Cane, Serpente, ecc... La classe Animale definisce quelle caratteristiche che un animale deve avere, le classi Gatto, Cane e Serpente le implementano.

A cosa serve tutto questo? Innanzitutto a dire, vuoi fare una classe che implementa Animale, beh, deve avere quei metodi. In secondo luogo serve a fare una cosa di questo genere.



Animale animale;

if(input == "gatto") animale = new Gatto();

if(input == "pesce") animale = new Pesce();



In questo moto tu hai un oggetto o Gatto o Pesce, ma che viene visto come un oggetto Animale generico. Cioè puoi richiamare solo i metodi definiti nell'interfaccia (a meno di non castare).

Se tu vuoi un gatto, devi instanziare un oggetto Gatto, non un oggetto Animale.



Cerco di fare un esempio più pratico.

Hai un interfaccia Persona, che ha due attributi ragioneSociale e codiceFiscale e i get e i set dei due attributi. Tu implementi due classi, PersonaFisica e PersonaGiuridica che implementano i metodi dell'interfaccia, il metodo setCodiceFiscale di PersonaFisica e quello di PersonaGiuridica sono diversi, perché sono diversi i codiciFiscali. Stesso discorso per ragioneSociale (supponi di avere un meccanismo che aggiunga la sigla srl, snc o spa)



Ora tu supponi di voler stilare un elenco delle ragioniSociali di tutte le persone che hai nel database, indifferentemente da se esse siano Persone Giuridiche o Persone Fisiche.

Fai una lista e ad ogni elemento che trovi nell'array appendi alla lista



Persona p;

se (persona è personaFisica) {

p = new PersonaFisica();

}

else{

p = new PersonaGiuridica();

}

lista.add(p);



poi stampi tutte le ragioniSociali degli oggetti contenuti nella lista, che per te saranno Persone, indipendentemente da se siano Fisiche o Giuridiche.



Se invece ti interessano solo le PersoneFisiche, allora non ha senso sfruttare l'interfaccia, ma sfrutti la classe implementata con tutto ciò che implementa. Se devi creare una nuova persona e salvarla nel database, allora non sfrutti l'interfaccia, ma la classe implementata



se vuoi creare una PersonaFisica{

PersonaFisica persona = new PersonaFisica(...);

//set

database.save(persona);

}

altrimenti{

PersonaGiuridica persona = new PersonaGiuridica(...);

//set

database.save(persona);

}



spero di essere stato chiaro. L'Interfaccia serve per dire: tutti gli oggetti che implementano questa interfaccia possono funzionare in questo modo. Quindi tu puoi sfruttare quegli oggetti come se fossere un oggetto di questa classe, ma non sono comunque oggetti di questa classe.

Un altro esempio, che a volte capita di utilizzare. Hai una LinkedList e un ArrayList, vuoi creare un metodo che possa leggerle indiffferentemente da quale delle due liste vuoi leggere.



Prendi come parametro una List generica



public void readList (List l){

Iterator i = l.iterator();

while(i.hasNext()){

ecc...

}

}



List è un'interfaccia e anche Iterator è un'interfaccia. Tu puoi passare una LinkedList o un ArrayList al metodo readList, ma per il metodo quelle sono List e basta. Il metodo legge la Lista qualsiasi List essa sia (un Vector, uno Stack, un ArrayList ecc..)



Ma se tu hai una LinkedList e basta e vuoi un metodo che legga quella LinkedList, allora non usi List, ma LinkedList con tutte le sue caratteristiche.
Meruk
2015-01-07 05:18:58 UTC
Ciao paolo, grazie per la risposta, ho compreso il tuo punto però sono ancora dubbioso, ti lascio intendere, ho letto questo documento (tra altri) : http://www.sauronsoftware.it/corsojava/Lezione_11.pdf

se non vuoi aprirlo il punto è questo :



nota : Animale è un'interfaccia con dei metodi, gatto una classe che la implementa



class Test {

public static void main(String[] args) {

Animale a1 = new Gatto();

etc etc



la mia domanda era proprio, facendo riferimento a questo specifico esempio visto che viene comodo : mi serve un gatto, nel main dichiaro Gatto micio = new Gatto(); che tanto io so essere un ' interfaccia di animale, oppure DEVO, per una buona struttura del software, dichiarere sempre animale micio = new Gatto(); ??



scusa per il capslock è solo per evidenziare il punto cruciale della mia richiesta :)



secondo punto : facendo come nell'esempio degli animali (cioè animale a = new Gatto();), se poi Gatto per esempio ha una variabile boolean ha_la_coda = true;



dal main io non posso accedervi e non capisco il motivo, neppure facendo (Gatto)a ... ovviamente invece se faccio Gatto a = new Gatto() ci accedo come voglio (tramite getter o setter oppure direttamente se pubblica o protected)



quindi che fare? quali sono le strategie di progettazione corrette?
?
2015-01-07 03:39:44 UTC
Prima ricapitoliamo come funzionano le interfacce.

Io creo un'interfaccia con dei metodi che dovranno poi essere implementati da chi implementa l'interfaccia: quindi ad esempio A ha dei metodi a1() e a2(). B decide di implementare A, quindi quando crei un oggetto di tipo B, sarai obbligato a definire i due metodi a1() e a2() all'interno di B, oltre ad altre variabili o metodi.

Se vuoi istanziare un oggetto di tipo B in C, semplicemente crei un oggetto di tipo B, che al suo interno conterrà i metodi implementati da A.

Ricorda che un'interfaccia non è un oggetto, quindi non può essere istanziato, serve solo per fornire a delle classi dei metodi che però le classi stesse dovranno implementare (in modi differenti a seconda delle necessità).
?
2015-01-08 08:55:15 UTC
https://it.answers.yahoo.com/activity/questions


Questo contenuto è stato originariamente pubblicato su Y! Answers, un sito di domande e risposte chiuso nel 2021.
Loading...