webForumDet fria alternativet

Arv och interface

7 svar · 350 visningar · startad av Rex Nemo

Rex NemoMedlem sedan mars 200225 inlägg
#1

Hej!
Har en klass som ska ärva från två andra klasser JPanel och Music, men jag vet inte hur jag ska lyckas med det.
Kan jag lösa detta problem utan att använda mig av ett interface?
Om jag måste använda ett interface, hur skulle ett sådant kunna se ut i så fall?
Har läst om interface, men fattar fortfarande inte riktigt. :-/

MVH Rex

PeWMedlem sedan juni 20006 839 inlägg
#2

Interface fungerar som en definition. Den innehåller endast metodprototyper och skall definieras abstrakt. De klasser som implementerar ett interface måste deklarera de metoder som finns i interfacet. Det är inget riktigt "arv" dock.

Annars är multipelt arv inte tillåtet i Java. Du kanske skulle kolla igenom designen och se om det inte går att lösa på nåt annat sätt. Varför vill du ha ett arv? Är det den andra klassen både en JPanel och en Music? Eller är det av nån annan anledning som du vill ha ett arv? Ett arv betecknar en är-relation... men om du har en består-av relation kanske det funkar t.o.m bättre med en komposition, dvs att du implementerar en "ö-klass" ist för att ärva dess funktionalitet.

Rex NemoMedlem sedan mars 200225 inlägg
#3

Hej och tack för svaret!
Du har nog rätt, ska ta mig en titt på designen igen och se om det inte går att lösa på något annat sätt.

MVH Rex :)

LimeMedlem sedan sep. 2001837 inlägg
#4

Jag skulle nog i 99 fall av 100 implementera en MusikPanel som ärver av JPanel. Kan inte komma ihåg när jag gjorde något som verkligen gjorde något som ärvde direkt from JPanel... :-)

/Lime

Rex NemoMedlem sedan mars 200225 inlägg
#5

Hej igen!
Programmet är tänkt att kunna hantera olika medier som musik, film och litteratur. Varje typ ska ha en egen klass med tillhörande panel och frame klasser (se nedan). När programmet startas, så visas endast klassen MediaFrame, som är själva huvudframen. Därefter väljer man vilken typ av media ska hanteras och då öppnas respektive panel för den mediatypen i huvudframen. Detta kan liknas vid en tom editor där man måste öppna ett projekt.

Ska försöka förklara hur jag har tänkt...

class Media {
	// Innehåller metoder som bl.a arbetar mot en databas.
}

class MediaFrame extends Media implements ActionListener {
	// Huvudframen där en instans av MusicPanel eller någon annan av de olika mediatyperna visas.
	// *** Vill även ärva från JFrame. ***
}

class Music extends Media {
	// Innehåller metoder som ärvts från Media och delvis modifierats, samt nya metoder.
}

class MusicPanel extends Music implements ActionListener {
	// En panel som ska visas i huvudframen.
	// *** Vill även ärva från JPanel. ***
}

class AlbumFrame extends Music implements ActionListener {
	// En fristående frame, där man skapar nya album.
	// *** Vill även ärva från JFrame. ***
}

if(detta är dålig design == true) {
Hur kan jag förbättra den?
}

MVH Rex :)

PeWMedlem sedan juni 20006 839 inlägg
#6

Sitter och tentapluggar så jag hinner inte sätta mig in i ditt problem nu. Men det ser mer ut som ett strukturerat program än OOP..

En grej dock:

class Music extends Media {
    // Innehåller metoder som ärvts från Media och delvis modifierats, samt nya metoder.
}

Eftersom du både vill modifiera basklassens metoder och lägga till nya så är detta vad man kallar för dåligt arv.

Skulle kanske dela upp problemet enligt nåt framework (som MVC) eller designpattern?

LimeMedlem sedan sep. 2001837 inlägg
#7

Som Pew säger, använd dig av mönstret "Model-View-Controller" i det här fallet eftersom det är klockrent att det är det du gör.

MediaPanel (eller MediaView om man ska vara noggran med syntaxen enligt mönstret) är basklass till alla saker som skall visas. Måste se till att den är uppdaterad med korrekt data. Antingen gör man det med Push-metod så att modellen vet att den kan anropa "updateData()" i View eller så gör man det som en subscrber-observer, d.v.s. modellen säger åt view att det finns uppdateringar och sedan hämtar view det den behöver från modellen.

MediaModel är basklass till alla Modeller. Här lägger du allt som har med logik att göra.

MediaController hanterar anropen från View och skickar dom vidare till modellen eller svarar direkt. Kontrollern kan också välja en ny view om det krävs.

Kolla på

http://java.sun.com/blueprints/patterns/MVC-detailed.html

som förklarar det väldigt bra.

/Lime

Rex NemoMedlem sedan mars 200225 inlägg
#8

Tack ska ni ha för hjälpen!
Behövde få lite konstruktiv kritik, har satt mig ner och börjat läsa lite mer om OOP och MVC.

MVH Rex :e

132 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
130 ms — hämta tråd, inlägg och bilagor (db)