Java: interfaces och undvika beroenden

Trädvy Permalänk
Medlem
Registrerad
Jul 2005

Java: interfaces och undvika beroenden

Hejsan!

Jag har byggt ihop ett Chatt program GUI bestående av ett gäng paneler, varje panel kan innehålla flera objekt.

Lite kort om konstruktionen av programmet, objekten och panelerna:

- Menu bar, där man kan väja privat chat, eller publik chat. Vad som väljs behöver hållas reda på i hela programmet.
- chatt fönster där texten visas : JTextArea
- en kompislista : JList
- Input fält för att skriva text: JTextField

- Man kan välja att visa publika chatten.
- Eller så kan man välja att visa privat chatt, för den kompis man markerat i kompis listan (JList), varje kompis i listan har en nickname.log som innehåller historik som ska skrivas ut i ChatWindow

Totalt så har det blivit 11st klasser inklusive main.

Problemet jag har är - hur kommer jag åt att kommunicera med alla objekt utan att behöva skicka in dom som argument till andra objekt som skapas ?

ChatWindow behöver i nuläget skickas in som argument i princip överallt till andra objekt. Min lärare menar att det är fel att behöva göra så för att det skapar förfärligt många beroenden vilket jag kan hålla med om.

Till exempel så behöver FriendsWindow objekt kunna kommunicera med ChatWindow objekt för att skriva ut chattloggarna, och Inputfältet som används till att skriva in text behöver kunna kommunicera med ChatWindow också och så vidare. Det slutar alltså med att jag får mycket beroenden / en jävla massa objekt som behöver skickas in som argument till andra objekt vid skapande.

Tydligen ska detta kunna undvikas, med interfaces och kanske arv om jag förstod honom rätt.

Skulle någon kunna skriva ett tydligt exempel på lösning på beroenden som en idiot kan förstå?

Jag har lite kännedom om interfaces, och hur jag skapar egna interfaces, men jag kan inte för guds skull förstå varför dom skulle vara bra till, när jag implementerar interfaces i klasser så måste ju ändå exakt samma funktioner skrivas in där, och därmed kan jag väl lika gärna skita i att ha interfaces och skriva dit de funktionerna, och jag kommer ändå att ha lika många beroenden enligt vad jag förstår.

tacksam för hjälp!

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009

Kolla in MVC samt Observer Pattern, det kan nog vara användbart i ditt läge

Trädvy Permalänk
Medlem
Registrerad
Jul 2005

går det på något sätt att använda interfaces för att undvika beroenden som att behöva skickas in objekt till alla mina andra instanser för kommunikation? undrade om jag missförstått en del av interfaces, varför det är bra - själv anser jag att jag klarar mej utmärkt utan att behöva skapa egna interfaces.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av Lexdale:

går det på något sätt att använda interfaces för att undvika beroenden som att behöva skickas in objekt till alla mina andra instanser för kommunikation? undrade om jag missförstått en del av interfaces, varför det är bra - själv anser jag att jag klarar mej utmärkt utan att behöva skapa egna interfaces.

Hej,

Nej, interfaces används inte för att undvika beroenden. Du måste inte använda dem och för mindre program kan det vara överflödigt, men det är viktigt att veta vad de fyller för funktion.

Kortfattat anger ett interface en specifikation, och en klass som implementerar ett eller flera interfaces lovar att uppfylla dessa specifikationer. Klasserna Knapp och Textruta i ett grafiskt gränssnitt kan t ex implementera interfacet Klickbar men hur de reagerar på klick är upp till klasserna.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Jul 2005
Skrivet av Teknocide:

Hej,

Nej, interfaces används inte för att undvika beroenden. Du måste inte använda dem och för mindre program kan det vara överflödigt, men det är viktigt att veta vad de fyller för funktion.

Kortfattat anger ett interface en specifikation, och en klass som implementerar ett eller flera interfaces lovar att uppfylla dessa specifikationer. Klasserna Knapp och Textruta i ett grafiskt gränssnitt kan t ex implementera interfacet Klickbar men hur de reagerar på klick är upp till klasserna.

ok!
Men när det kommer till att skapa och använda egna interfaces, vad är det bra till?

Säg att en interface har en metod exempelvis interface { printHello(); }
vad är meningen att implementera den i en klass när jag lika gärna kan lägga till metoden på vanligt sätt?

som jag förstår det så finns det inget sätt att använda en interface för att getValue(); på ett objekts attribut?

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av Lexdale:

ok!
Men när det kommer till att skapa och använda egna interfaces, vad är det bra till?

Säg att en interface har en metod exempelvis interface { printHello(); }
vad är meningen att implementera den i en klass när jag lika gärna kan lägga till metoden på vanligt sätt?

som jag förstår det så finns det inget sätt att använda en interface för att getValue(); på ett objekts attribut?

Ett gränssnitt (ordagrann översättning av 'interface') är ett kontrakt som intygar att en klass går att använda på ett visst sätt. Du kan ha flera klasser som delar ett och samma gränssnitt och genom det behandla dem på samma sätt. Utan något gemensamt att greppa i kan inte Java-kompilatorn verifiera att koden är körbar.

public interface Klappbar { void klappa(); } public class Katt implements Klappbar { public void klappa() { println("katten spinner belåtet"); } } public class Händer implements Klappbar { public void klappa() { println("du klappar händerna"); } } // en guldfisk går inte att klappa i vårt scenario public class Guldfisk { } List<Klappbar> klappbaraSaker = new ArrayList<>(); klappbaraSaker.add(new Katt()); klappbaraSaker.add(new Händer()); // följande går inte att klappa; om man avkommenterar raden nedan kommer programmet inte kompilera // klappbaraSaker.add(new Guldfisk()); for (Klappbar grej : klappbaraSaker) { grej.klappa(); }

Så, när vill man skapa ett interface? Det beror på hur du skriver ditt program. Om du skriver ett ramverk med mål att låta andra utvecklare lägga till funktionalitet utan att behöva kompilera om din kod är interfaces väldigt användbart. Du kan skriva en metod som tar emot något Klappbart utan att veta vilken klass det handlar om. Även när man skriver ett program för eget bruk kan det vara praktiskt att definiera interfaces där man vill specificera vad något ska ha för kontaktytor, utan att spika en konkret implementation (dvs klass.)

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Jul 2005

@Teknocide:

Tackar, nu gick det faktiskt upp lite för mig här ! helt underbar förklaring