14. maj 2003 - 19:44Der er
28 kommentarer og 1 løsning
Interface problemer
Jeg har aldrig rigtig fattet hvad et interface er godt for, udover at det kan anvendes som en slags bro mellem klasser - et eller andet abstract halløj, men alligevel synes jeg godt at jeg kunne bruge dem ind imellem
Men nu er kæden hoppet helt af !
Jeg ville se hvad jeg kunne udrette med følgende metode: listFiles(FileFilter filter) fra klassen java.io.File
Men den tager et interface som argument og så stod jeg af.
Er der nogen som kan fortælle hvordan et interface generelt anvendes og især i ovenstående situation ??
Ja - jeg har tæsket adskillige tutorials igennem uden at have fattet det 100%, men selvfølgelig er ekstremt gode links velkomne.
Måske har jeg fyret rigelig med points på, men jeg fatter det bare ikke !!
I den situation og i mange andre situationer er pointen den, at der skal kaldes med et argument.
Det argument skal være af en klasse som implementerer det pågældende interface.
Det kan være enhver klasser der implementerer interfacet.
Men fordi Java compileren insisterer på at en klasse der implementerer et interface skal implementere alle metoder i interfacet, så ved den metode der kaldes at den kalde alle metoder i interfacet - selvom der kan være vidt forskellige implementeringer.
Lad os sige at du laver en klasse som skal bruge noget konfigurations data, men at du vil være meget fleksibel med hvordan den konfiguration kan gemmes.
Så laver du:
public interface XConf { public int getA(); public String getB(); }
og i din klasse:
void dosomething(XCong cfg) { ... int a = cfg.getA(); String b = cfg.getB(); ... }
Så laver du:
public class XConfFile { public XConfFile(String filename) { // open file } public int getA() { // læs A fra fil } public String getB() { // læs B fra fil } }
public class XConfDB { public XConfDB(String driver, String url, String un, String pw) { // open database connection } public int getA() { // læs A fra database } public String getB() { // læs B fra database } }
og så man kalde din metode med både: dosomething(new XConfFile("X.cfg")); og: dosomething(new XConfDB(driver, url, "", ""));
og din metode kan bruge getA og getB uden at vide hvad de faktisk kalder.
Men interface definerer en kontrakt for hhvad klasserne som minimum skal kunne.
Jeg spørg nok om mere end ti tosser kan svare på, men hvordan hænger nedenstående så sammen med de øvrige klasser (XConfFile, XConfDB) efter implemeteringen af interfacet ?
og i din klasse:
void dosomething(XCong cfg) { ... int a = cfg.getA(); String b = cfg.getB(); ... }
Pointen er at du nu kan kalde dosomething metoden med både en XCongFile og en XConfDB, fordi metoden kun forventer en XConf og begge klassser implementerer XConf.
Okay - på mig virker det umiddelbart som at gå baglæns gennem verdenen
Kan man virkelig lave en reference til et interface og initiere referencen via et object som implementerer interfacet. Og derefter bruge den som parameter i et metodekald ?
Lad os vende tilbage til FileFilter. SUN programmørerne sidder og skal kode listFiles og de vil gerne give noget af din kode mulighed for at bestemme om en fil skal med eller ej.
De aner ikke hvordan din kode vil se ud, hvad den vil bruge til at afgøre om filen skal med, hvad klassen vil hedde.
Men de laver nu et interface FileFilter med en enkelt metode accept. Nu kan du kalde deres metode med en hvilken som helst klasse der implementerer FileFilter (og dermed accept metode). Deres kode kalder bare accept metode som jo skal være der.
Det havde nu været rart, hvis der i de tutorials jeg har tæsket igennem var et eksempel a la dit, så man også havde fået den vinkel af interfacets muligheder.
Mange tak for hjælpen.
Jeg skal lige sunde mig inden jeg kører videre med FileFilter - TAK !
Det der tit mangler er en forklaring på hvorfor man gør det sådan.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.