2012-10-20 18 views
10

Eventuali duplicati:
What does it mean to “program to an interface”?
Interface vs Abstract Class (general OO)confusi su interfaccia Java

io sono di nuovo da imparare JAVA e ora sono confuso su interfaccia. Ho cercato e letto molti materiali, ma non è ancora chiaro.

Quando cerco di trovare alcune informazioni sull'interfaccia, vedo molte persone parlare della relazione tra interfaccia e classe astratta. Ma non so nemmeno perché contrastano questi due. Perché penso che la classe astratta sia usata per dire ad altre persone che non puoi creare un oggetto di questa classe astratta e se vuoi, devi modificare la classe astratta. Questo è qualcosa sull'ereditarietà, giusto?

Ma non conosco il significato di interfaccia. C'è un interface a e se uno class B implementa l'interfaccia a, deve utilizzare la parola riservata class B implements a e quindi completare tutti i metodi richiesti dall'interfaccia. Ma la mia domanda è, se la classe B deve completare tutti i metodi da sola, qual è il significato dell'interfaccia? Penso che non ne abbiamo bisogno. Non lo capisco molto. Ho letto molte frasi come: "l'interfaccia può riflettere il pensiero centrale del linguaggio orientato agli oggetti", "l'interfaccia può aiutare a rendere il programma più semplice" e così via. Ma non riesco davvero a capire il significato.

Quindi, qualcuno può mostrarmi qualche esempio per capire l'interfaccia? Oppure puoi dirmi qualche link utile o i libri che descrivono chiaramente l'interfaccia. Spero davvero di capirlo. GRAZIE!

+0

può aiutare a esplorare di più sulle interfacce in java: http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – Jimmy

+0

L'unico scopo di un l'interfaccia è quella di ottenere * il comportamento del protocollo definito pubblicamente *, il che significa che la classe che eredita l'interfaccia deve incorporare tutti i metodi definiti da tale interfaccia è una regola o più specificamente è * una definizione di protocollo * per quella classe. (Ogni cosa definita all'interno dell'interfaccia deve essere comunque pubblica). – Lion

risposta

7

Supponiamo di avere una classe Car e Vegetable classe che non ha alcuna relazione nella vita reale e non v'è un comportamento comune chiamato wash(). Perché possiamo lavare una macchina e lavare anche un vegetale. Ma lavare un'auto e lavare un vegetale è un processo/comportamento totalmente diverso.

Per esempio: Car deve essere lavato con una pompa elettrica, Vegetables sotto il lavello della cucina. Quindi il modo di lavare è diverso. Pertanto, nell'interfaccia, il processo di lavaggio viene eseguito come metodo wash() e Washable e vengono implementati nella classe Car e Vegetable.

interface Washable { 

public void wash(); 

} 

public class Car implements Washable { 

public void wash() { 

    // wash the car with a power pump 

} 


} 

public class Vegetable implements Washable { 

public void wash() { 

    // wash the vegetable under a kitchen sink 

} 


} 

Come persona, si consiglia di lavare un'auto e anche un vegetale.

public class Person { 


Washable washableObject = new Car(); 

washableObject.wash(); 

washableObject = new Vegetable(); 

washableObject.wash(); 




} 
  1. Così interfaccia è un modo per collegare le classi non correlate che ha un comune behavior.But il comportamento sarà diverso attuata o può essere modificata in futuro.

  2. Un giorno si decide di cambiare il modo in cui si lava un'auto. Supponete di aver acquistato una "lavatrice per auto". Quindi l'implementazione cambia all'interno del metodo wash() nella classe Car.

    public class Auto implementa lavabile {

    public void wash() { 
    
        // wash the car with my new car washing machine !! 
    
    } 
    

    }

ma come persona, è ancora chiamare il metodo wash(). Il modo in cui viene implementato il metodo wash() è stato modificato (lavaggio dell'auto con la tua nuova lavatrice per auto), questa modifica dell'implementazione non ha influito sulla tua classe Person.

Spero che tu sia chiaro perché utilizziamo lo interfaces ora.

+0

Ottimo! È vivido e chiaro! Grazie! – lkkeepmoving

+0

Sì, molto chiaro e facile da capire. Ma perché? Non vedo alcun beneficio. Sai che stai lavando una macchina perché la hai istanziata come una nuova auto(). Potresti semplicemente avere una classe genitore chiamata Washable, make wash() abstract, e avere sia Auto che Verdure ereditate da Washable, implementando la loro versione di wash(). Cosa mi manca? –

+1

@ScottBiggs Immagina di avere una classe SuperWashMachine con un metodo washAll(). Riceve una serie di lavabili. Devi solo passare attraverso l'array e chiamare il metodo wash() perché il "contratto" dice che qualsiasi classe che implementa Washable sa come farlo. Questo è tutto, questo metodo non ha nemmeno bisogno di sapere di qualsiasi auto, verdura o qualsiasi altra classe specifica, si occupa solo di cose lavabili. Perché non usare l'ereditarietà? Beh, forse è qualcosa di semantico. Idealmente una macchina e una verdura dovrebbero avere più in comune oltre al fatto di essere lavabili per impostare una relazione "è" con una classe padre comune. –

1

Fondamentalmente, interface è un modo per realizzare l'ereditarietà multipla senza doverlo effettivamente fare. (Il che non vuol dire che la gente di Java sia "dispiaciuta" - l'ereditarietà multipla è eccessivamente disordinata e inefficiente da implementare.)

Ciò significa che è possibile avere due classi A e B completamente separate, senza comune antenato diverso da Object e, se implementano lo stesso interface, è possibile sostituirne uno per l'altro (purché si faccia riferimento solo ai metodi nell'interfaccia).

+0

Incompleto, ma la migliore risposta qui. –

1

Pensa in interfacce come i contratti tra una classe e l'utente. Quando una classe implementa un'interfaccia, sta dicendo che promette di offrire tutti i metodi definiti dall'interfaccia.

+0

@Ravn Bad word xD Ci scusiamo. Fisso. –

1

Supponendo di aver compreso l'ereditarietà della classe, penso a un'interfaccia simile a una classe scheletro, in cui la struttura di una classe è descritta ma non effettivamente scritta/implementata.

Un'altra classe può quindi funzionare con qualsiasi classe che implementa un'interfaccia particolare anche se non è stata ancora implementata.

Ad esempio, qualcuno può creare un'interfaccia denominata Animal. I suoi metodi forse: Talk(), Walk() e Eat(). È possibile scrivere una classe Dog che implementa Animal che stampa "woof" quando viene chiamato il metodo Talk(). Quindi un'altra classe saprà come lavorare con tutte le classi che implementano l'interfaccia Animal.

UPD

Un buon esempio del mondo reale è il JDBC Statement Interfaccia database. Questo stabilisce un numero di proprietà richieste che un produttore di database dovrà implementare, come ad esempio execute(String sql). Oracle lo implementerà in modo diverso da Postgresql. Ciò consente al database di essere scambiato per un altro ma il codice utente rimane lo stesso.

1

Un codice semplice per comprendere l'interfaccia e la classe.

import java.util.List; 
import java.util.ArrayList; 
public class Q01 { 
List<Shape> shapes= new ArrayList(); 

public void add() { 
    shapes.add(new Square(3.0)); 
    shapes.add(new Circle(2.0)); 
} 
public void print() { 
    for (int i = 0; i < shapes.size(); i++) { 
     Shape shape = shapes.get(i); 
     System.out.println(shape.getClass().getSimpleName() + " --->" + shape.getArea()); 
    } 
} 

public static void main(String[] args) { 
    Q01 q01= new Q01(); 
    q01.add(); 
    q01.print(); 
} 

public interface Shape { 
    double getArea(); 
} 

public class Square implements Shape{ 
    private double edge; 

    public Square(double edge) { 
     this.edge = edge; 
    } 
    public double getArea() { 
     return edge*edge; 
    } 
} 
public class Circle implements Shape{ 
    private double radius; 

    public Circle(double radius) { 
     this.radius = radius; 
    } 

    public double getArea() { 
     return 3.14 * radius * radius; 
    } 
} 
} 
+0

Nella classe Q01, il tipo di "Elenco forme = nuovo ArrayList();" deve essere "Lista "? Perché? – lkkeepmoving

+0

Perché, non sappiamo esattamente che tipo di esso. può essere cerchio o quadrato? – chrome

+0

Capito, grazie! – lkkeepmoving