|
| implementerer flere interfaces som har ens~ Fra : desilva |
Dato : 09-02-04 10:54 |
|
hvordan implementerer man lige to interfaces som begge har en metode int
add(int,int).
Hvis vi kalder dem for interfaceA og interfaceB, så kan man i andre sprog
skrive
class minKlasse implements interfaceA,interfaceB {
int interfaceA.add(int a,int b) {
return a+b;
}
int interfaceB.add(int a,int b) {
return a+b+10;///bare for at være anderledes
}
}
Det vil java dog ikke være med til. Den forventer semikolon.. det gør den
næppe, så den mener velsagtens at man ikke kan angive interfacet i
implementationen. Hvad gør man så hvis man skal implementere to interfaces
og disse har to enslydende funktioner, som dog ER forskellige?
| |
Stefan L. Jensen (09-02-2004)
| Kommentar Fra : Stefan L. Jensen |
Dato : 09-02-04 12:23 |
|
> hvordan implementerer man lige to interfaces som begge har en metode int
> add(int,int).
> Hvis vi kalder dem for interfaceA og interfaceB, så kan man i andre sprog
> skrive
> class minKlasse implements interfaceA,interfaceB {
> int interfaceA.add(int a,int b) {
> return a+b;
> }
> int interfaceB.add(int a,int b) {
> return a+b+10;///bare for at være anderledes
> }
> }
>
> Det vil java dog ikke være med til. Den forventer semikolon.. det gør den
> næppe, så den mener velsagtens at man ikke kan angive interfacet i
> implementationen. Hvad gør man så hvis man skal implementere to interfaces
> og disse har to enslydende funktioner, som dog ER forskellige?
Tag et kig på
http://www.javaworld.com/javaworld/javaqa/2001-03/02-qa-0323-diamond.html
// Stefan L. Jensen
| |
desilva (09-02-2004)
| Kommentar Fra : desilva |
Dato : 09-02-04 13:01 |
|
> Tag et kig på
> http://www.javaworld.com/javaworld/javaqa/2001-03/02-qa-0323-diamond.html
Ok. Kiggede. Blev dog lidt skuffet over javas løsning... nemlig at der ingen
er.
"If you have access to the source code the best course of action is to
rename the methods in either of the above cases. If you don't have access,
you are stuck."
Eksempelvis c# løser da problemet glimrende. Oh well.. må vel finde mig i
det.
| |
Niels Dybdahl (09-02-2004)
| Kommentar Fra : Niels Dybdahl |
Dato : 09-02-04 14:08 |
|
> hvordan implementerer man lige to interfaces som begge har en metode int
> add(int,int).
En løsning som kan bruges i nogle tilfælde er:
class MinKlasse {
public InterfaceA interfaceA = new InterfaceA {
int add(int a, int b) {
return a+b;
}
}
public InterfaceB interfaceB = new InterfaceB {
int add(int a, int b) {
return a+b+10;
}
}
}
interfaceA og interfaceB har fuld adgang til MinKlasses medlemmer.
Niels Dybdahl
| |
desilva (09-02-2004)
| Kommentar Fra : desilva |
Dato : 09-02-04 14:23 |
|
> class MinKlasse {
> public InterfaceA interfaceA = new InterfaceA {
> int add(int a, int b) {
> return a+b;
> }
> }
>
> public InterfaceB interfaceB = new InterfaceB {
> int add(int a, int b) {
> return a+b+10;
> }
> }
> }
>
> interfaceA og interfaceB har fuld adgang til MinKlasses medlemmer.
Men nu er MinKlasse jo ikke defineret til at implementere de to interfaces?
Ellers er jeg i hvert fald helt lost med hensyn til java.
| |
Niels Dybdahl (10-02-2004)
| Kommentar Fra : Niels Dybdahl |
Dato : 10-02-04 09:06 |
|
> > class MinKlasse {
> > public InterfaceA interfaceA = new InterfaceA {
> > int add(int a, int b) {
> > return a+b;
> > }
> > }
> >
> > public InterfaceB interfaceB = new InterfaceB {
> > int add(int a, int b) {
> > return a+b+10;
> > }
> > }
> > }
> >
> > interfaceA og interfaceB har fuld adgang til MinKlasses medlemmer.
>
> Men nu er MinKlasse jo ikke defineret til at implementere de to
interfaces?
> Ellers er jeg i hvert fald helt lost med hensyn til java.
Det betyder i de fleste tilfælde ikke så meget. De to interfaces skal vel
bruges to forskellige steder. F.eks:
EnAndenKlasse klasse2 = new EnAndenKlasse();
EnTredjeKlasse klasse3 = new EnTredjeKlasse();
MinKlasse minKlasse = new MinKlasse();
klasse2.addListener(minKlasse.interfaceA);
klasse3.addListener(minKlasse.interfaceB);
Istedet for at bruge selve klassen bruges hhv interfaceA og interfaceB. Det
virker fint i de fleste tilfælde. Der er alligevel ingen funktioner som
forventer en klasse som implementerer begge interfaces, da dette ikke er
muligt.
Niels Dybdahl
| |
Ulrik Magnusson (10-02-2004)
| Kommentar Fra : Ulrik Magnusson |
Dato : 10-02-04 07:27 |
|
desilva wrote:
> hvordan implementerer man lige to interfaces som begge har en metode int
> add(int,int).
> Hvis vi kalder dem for interfaceA og interfaceB, så kan man i andre sprog
> skrive
> class minKlasse implements interfaceA,interfaceB {
> int interfaceA.add(int a,int b) {
> return a+b;
> }
> int interfaceB.add(int a,int b) {
> return a+b+10;///bare for at være anderledes
> }
> }
>
> Det vil java dog ikke være med til. Den forventer semikolon.. det gør den
> næppe, så den mener velsagtens at man ikke kan angive interfacet i
> implementationen. Hvad gør man så hvis man skal implementere to interfaces
> og disse har to enslydende funktioner, som dog ER forskellige?
Interfaces er bare en samling metodesignaturer - add metoderne ER
netop ikke forskellige, men identiske, da de har samme signatur.
Så spørgsmålet er, hvad du vil med konstruktionen? Du kan jo altid
implementere add(int,int) og opfylde begge interfaces, og så
tilføje en addMore(int,int) som laver noget andet - interfaceA.add
og interfaceB.add er vel bare en slags specielle navne på metoder?
Eventuelt kunne du nedarve fra minKlasse og lade minKlasseA og
minKlasseB tilføje deres egne add(int,int) implementationer.
Hvad skulle i øvrigt være resultatet af at kalde new
minKlasse().add(1,2) i ovenstående være? 3 eller 13?
Ulrik Magnusson
| |
desilva (10-02-2004)
| Kommentar Fra : desilva |
Dato : 10-02-04 12:17 |
|
> Interfaces er bare en samling metodesignaturer - add metoderne ER
> netop ikke forskellige, men identiske, da de har samme signatur.
De kan sagtens gøre noget forskelligt, sommit eksempel også viste. Samme
navn, samme returtype og samme parametre, men de skal ikke gøre det samme.
Et (lidt fjoget eksempel) kan være en dims som både kan spille musik og
kryds og bolle. Den implementerer IMusicPLayer og IStupidGamePlayer- Begge
har metoden void play(int spilleTid);
Samme metodesignatur, men de gør næppe det samme.
Typecaster vi dimsen til IMusicPlayer og kalder play, så skal den ikke gå i
gang med kryds og bolle.
Så kan metodenavnene ændres, men det er jo kun hvis du selv styrer
kildekoden og definitionen af de interfaces.
> Hvad skulle i øvrigt være resultatet af at kalde new
> minKlasse().add(1,2) i ovenstående være? 3 eller 13?
Lad mig svare med..
((InterfaceA)(new minKlasse())).add(1,2) =>3
((InterfaceB)(new minKlasse())).add(1,2) =>13
Personligt anvender jeg dog ikke interfaces sådan. Det vil være noget rod.
Det er hvis objektet skal kunne indgå i eksempelvis to containerklasser som
kræver deres indhold skal følge forskellige interfaces
| |
Ulrik Magnusson (10-02-2004)
| Kommentar Fra : Ulrik Magnusson |
Dato : 10-02-04 15:07 |
|
desilva wrote:
>>Interfaces er bare en samling metodesignaturer - add metoderne ER
>>netop ikke forskellige, men identiske, da de har samme signatur.
>
>
> De kan sagtens gøre noget forskelligt, sommit eksempel også viste. Samme
> navn, samme returtype og samme parametre, men de skal ikke gøre det samme.
> Et (lidt fjoget eksempel) kan være en dims som både kan spille musik og
> kryds og bolle. Den implementerer IMusicPLayer og IStupidGamePlayer- Begge
> har metoden void play(int spilleTid);
> Samme metodesignatur, men de gør næppe det samme.
Hvis de ikke gør det samme, er det to forskellige klasser -
interfaces siger ikke noget om, hvad der gøres, kun at en kommando
er tilgængelig. Brug i stedet nedarvning eller delegering i Java.
Ulrik Magnusson
| |
desilva (10-02-2004)
| Kommentar Fra : desilva |
Dato : 10-02-04 16:47 |
|
> Hvis de ikke gør det samme, er det to forskellige klasser -
hvis de ikke gør det samme, så er det to forskellige interfaces, ja.
> interfaces siger ikke noget om, hvad der gøres, kun at en kommando
> er tilgængelig. Brug i stedet nedarvning eller delegering i Java.
Ja, netop. Hvad der er tilgængeligt. Mit objekt skal kunne ses som både en
musik- og spil-spiller. Dem der lavede de to interfaces har begge lavet en
metode kaldet play. Jeg skal kunne ligge i en liste over musikspillere, så
en bruger kan vælge mit objekt og spille musik, og jeg skal kunne ligge i en
liste over spil-spillere så en bruger kan spille lidt sjow... altså i det
tænkte eksempel.
Der er intet i vejen for at implementere to interfaces.
| |
Ulrik Magnusson (10-02-2004)
| Kommentar Fra : Ulrik Magnusson |
Dato : 10-02-04 17:51 |
|
desilva wrote:
> > Hvis de ikke gør det samme, er det to forskellige klasser -
>
> hvis de ikke gør det samme, så er det to forskellige interfaces, ja.
>
Ikke i Java.
Ulrik Magnusson
| |
desilva (10-02-2004)
| Kommentar Fra : desilva |
Dato : 10-02-04 19:14 |
|
> > hvis de ikke gør det samme, så er det to forskellige interfaces, ja.
> Ikke i Java.
Hvorfor mener du at java adskilder sig på det punkt. Hvad skulle nu
pludselig være problemet i at implementere to forskellige interfaces som
tilfældigvis har metodedefinitioner der har enslydende definition og
forskellige implementation?
Kan ikke rigtig se din pointe med "ikke i java". Interfaces er ikke java
eller c++, men OOD.
| |
Ulrik Magnusson (10-02-2004)
| Kommentar Fra : Ulrik Magnusson |
Dato : 10-02-04 20:13 |
|
desilva wrote:
> Kan ikke rigtig se din pointe med "ikke i java". Interfaces er ikke java
> eller c++, men OOD.
Jeg snakker om Java interfaces, du snakker om noget andet, så vi snakker
bare forbi hinanden, hvilket egentlig også var min pointe - du fik det bare
til at lyde som om det var Java interfaces..
Ulrik Magnusson
| |
desilva (10-02-2004)
| Kommentar Fra : desilva |
Dato : 10-02-04 21:17 |
|
> Jeg snakker om Java interfaces, du snakker om noget andet, så vi snakker
> bare forbi hinanden, hvilket egentlig også var min pointe -
Vi er begge punkter i et 3d rum, så det er pokkers svært ikke at ramme forbi
Mit første spørgsmål var jo egentlig også java specifikt. Senere talte jeg
så om hvorfor man vil implementere to interfaces, hvilket var noget mere
generelt. Når man oplever flere OO sprog, så begynder man at forvente de
gode side af sprog A i alle de andre.
| |
Niels Dybdahl (10-02-2004)
| Kommentar Fra : Niels Dybdahl |
Dato : 10-02-04 15:07 |
|
> Et (lidt fjoget eksempel) kan være en dims som både kan spille musik og
> kryds og bolle. Den implementerer IMusicPLayer og IStupidGamePlayer- Begge
> har metoden void play(int spilleTid);
> Personligt anvender jeg dog ikke interfaces sådan. Det vil være noget rod.
> Det er hvis objektet skal kunne indgå i eksempelvis to containerklasser
som
> kræver deres indhold skal følge forskellige interfaces
Som tidligere nævnt kan det i nogle tilfælde klares med interne klasser som
implementerer de to interfaces. Men hvis de to interfaces skal bruges i to
containere og du har brug for at kunne få en reference til det oprindelige
object, så lav en ekstra klasse som har en reference til hovedobjektet:
class IMusicPlayer implements InterfaceA {
void play(int spilleTid) {
}
....
};
class IStupidGamePlayer implements InterfaceB {
void play(int spilleTid) {
}
public IMusicPlayer musicPlayer;
IStupidGamePlayer(IMusicPlayer musicPlayer) {
this.musicPlayer=musicPlayer;
}
};
Hvis du får et object fra container B og ser at det er en IStupidGamePlayer,
så har du også en reference til din IMusicPlayer.
Niels Dybdahl
| |
desilva (10-02-2004)
| Kommentar Fra : desilva |
Dato : 10-02-04 16:44 |
|
> Som tidligere nævnt kan det i nogle tilfælde klares med interne klasser
som
> implementerer de to interfaces. Men hvis de to interfaces skal bruges i to
> containere og du har brug for at kunne få en reference til det oprindelige
> object, så lav en ekstra klasse som har en reference til hovedobjektet:
Ja. Beklager jeg ikke fik svaret tilbage. Dit forslag er finfin
| |
|
|