Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Interfacce

  1. #1

    Interfacce

    Salve,

    Non sto capendo l'utilità di una classe che ci ha fornito il professore.
    Mi spiego meglio: In una esercitazione ci ha detto di creare queste due interfacce

    codice:
    package distance;
    
    
    import data.Item;
    
    
    public interface IntDistanceEdit {
    
    
    	
    	Double Edit ( Item o1, Item o2);
    }
    e
    codice:
    package distance;
    
    
    import data.Item;
    
    
    public interface IntDistanceEuclidea {
    	
    	Double Euclidea (Item o1, Item o2);
    	
    	
    
    
    }
    Successivamente creare la classe ImplDistance che implementava queste due interfacce (e i relativi metodi). Infine ci ha fornito questa classe.
    codice:
    package distance;
    
    
    public class Calcolo {
    	
    	static ImplDistance i=new ImplDistance();
    	//Restituisce l interfaccia per il calcolo della distanza euclidea
    	public static IntDistanceEuclidea distanceE(){
    		return i;
    	}
    	//Restituisce l interfaccia per il calcolo della distanza Edit
    	public static IntDistanceEdit distanceEdit(){
    		return i;
    	}
    }
    Qualcuno mi sa dire a cosa serve la classe calcolo? Io per effettuare i vari calcoli uso la classe ImplDistance non questa.

  2. #2
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Con un certo sforzo di fantasia direi che vuole usare due classi con due metodi diversi per calcolare la distanza, una sorta di ircocervo.
    Da qualche parte, suppongo sempre sforzandomi, ci sarà un qualche proprietà che distingue quale classe usare.
    Sembra un mischione di "logica" C e Java (sempre con grandissimo sforzo!)

  3. #3
    Forse mi hai dato un input per capire cosa vuole fare il professore con questa classe anche se non mi e' ancora proprio chiaro, devo provare un po. Ti ringrazio per la risposta.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quella è evidentemente un'applicazione del pattern Factory Method (inoltre rappresenta anche un'applicazione del pattern singleton). Viene usata anche dal core Java (vedi ad esempio la classe NumberFormat, anche se non è un esempio di puro factory method).

    Quello che accade è questo: c'è una classe composta di metodi statici che si occupano della creazione e restituzione di oggetti appartenenti ad una super-classe astratta o, appunto, un'interfaccia. Questa classe ha il solo scopo di fornire un'implementazione concreta di un tipo di oggetto (quale sia l'effettiva implementazione concreta non è importante), che altrimenti sarebbe "difficile" o "macchinoso" reperire (o, addirittura, impossibile se è questo lo scopo della classe).

    Nel caso specifico quella classe serve a fornire due "diverse" implementazioni concrete di due interfacce (ho scritto diverse tra virgolette apposta). Chiamando il metodo distanceE() si ottiene una implementazione concreta dell'interfaccia IntDistanceEuclidea, mentre invocando il metodo distanceEdit() si ottiene una implementazione concreta dell'interfaccia IntDistanceEdit. Quali che siano le due implementazioni concrete non interessa a nessuno, quello che viene garantito è che i due oggetti restituiti soddisfano il contratto imposto dalle due interfacce. Il fatto che l'oggetto restituito da entrambi i metodi sia lo stesso è solo una scelta implementativa: l'oggetto è in grado di svolgere entrambi i compiti, quindi tanto vale restituire la stessa istanza, ma non è un requisito è solo una scelta... si sarebbe tranquillamente potuto creare due classi distinte, ciascuna con l'implementazione di una delle due interfacce e restituire per ciascun metodo il corrispettivo oggetto, non cambiava (quasi) nulla.

    In buona sostanza, chi deve usare un'implementazione concreta dell'interfaccia IntDistanceEuclidea non dovrà preoccuparsi né di creare un oggetto specifico, né di sapere con precisione di che tipo di oggetto si tratti, gli basterà richiedere alla Factory Class di restituire un oggetto con le caratteristiche necessarie e punto:

    codice:
    IntDistanceEuclidea myObj = Calcolo.distanceE();
    // myObj è un oggetto che sicuramente possiede il metodo Euclidea()
    // in quanto rispetta il contratto imposto da tale interfaccia...
    // quindi posso usarlo senza preoccuparmi di sapere quale sia la sua reale istanza concreta
    Item y1 = ...;
    Item y2 = ...;
    Double x = obj.Euclidea(y1, y2);

    Questo porta ad un altro enorme vantaggio: il disaccoppiamento. Se un domani volessi usare una implementazione diversa di IntDistanceEuclidea (magari più performante o che agisce in modo diverso) potrei farlo semplicemente andando a modificare l'oggetto restituito dalla classe Calcolo senza dover toccare nemmeno una riga di tutti i programmi che eventualmente la usassero.

    Con il tuo approccio (ovvero usare direttamente la classe ImplDistance) saresti legato a quella precisa implementazione dell'interfaccia e se un domani volessi cambiarla dovresti andare a modificare tutti i programmi in cui hai usato direttamente ImplDistance.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ti ringrazio veramente tanto per la spiegazione. Mi e' stata veramente utilissima. Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.