|
| Problemer med interfaces i Visual C++ Fra : Klaus Petersen |
Dato : 29-05-03 18:03 |
|
Hej ng.
Jeg har et problem med interfaces, som skildres i denne kode:
<KODE>
#include "stdio.h"
class ILamers
{
virtual void Lame () = 0;
virtual void Spy () = 0;
};
class Microsoft : public ILamers
{
private:
void This_Should_Be_Hidden () {};
public:
void Lame () { printf ("lame\n"); };
void Spy () { printf ("spy\n"); };
};
class INoBrainer
{
public:
virtual void GoToHell () = 0;
};
class BillGates : public Microsoft, public INoBrainer
{
private:
void This_Should_Be_Hidden_2 () {};
public:
void GoToHell () { printf ("die and go to hell\n"); };
};
int main(int argc, char* argv[])
{
INoBrainer *bill = new BillGates ();
bill->GoToHell (); // dette er det eneste browse info viser
return 0;
}
</KODE>
Som der står i koden, så viser "browse info" kun metoden GoToHell fra
interfacet INoBrainer ... og det er vel fordi bill er en pointer til et
INoBrainer interface't.
Hvis det var optimalt, ville jeg man kunne se **både** INoBrainer og ILamers
(BillGates klassen nedarver jo fra Microsoft, og har altså implementationen
af ILamers).
Men hvordan skal det bygges op?
Jeg lægger vægt på at:
1) Pointeren i main er til et interface så privates bliver skjult
2) At BillGates nedarver fra Microsoft, så man fra main kan nå Microsoft's
metoder gennem BillGates.
Kan nogen hjælpe ?
Jeg håber i forstår problemstillingen, for det er altså lidt svært at
forklare.
Klaus.
| |
Robert Larsen (29-05-2003)
| Kommentar Fra : Robert Larsen |
Dato : 29-05-03 19:46 |
|
Når du har en pointer til INoBrainer kan du KUN se GoToHell() metoden,
for der er jo intet andet. Så er det lige meget, hvilket objekt
pointeren peger på.
> 1) Pointeren i main er til et interface så privates bliver skjult
Private members skulle meget gerne altid skjules, medmindre du koder
inden i klassen selv (this-> her skulle alt gerne vises).
> 2) At BillGates nedarver fra Microsoft, så man fra main kan nå Microsoft's
> metoder gennem BillGates.
Ja, gør du bare det.
BillGates * bg = new BillGates();
bg-> //Her popper en liste af metoder op indeholdende: GoToHell(),
//Lame() og Spy() da det er de eneste funktioner, som kan
//tilgåes globalt på objektet.
Hvis du i implementeringen af en funktion på BillGates klassen skrev
this-> ville samme liste poppe op men den ville også indeholde de
funktioner som er protected i forfædrene og de som er private i BillGates.
Robert
| |
Klaus Petersen (29-05-2003)
| Kommentar Fra : Klaus Petersen |
Dato : 29-05-03 20:36 |
|
> Private members skulle meget gerne altid skjules, medmindre du koder
> inden i klassen selv (this-> her skulle alt gerne vises).
Enig....
> > 2) At BillGates nedarver fra Microsoft, så man fra main kan nå
Microsoft's
> > metoder gennem BillGates.
>
> Ja, gør du bare det.
>
>
> BillGates * bg = new BillGates();
>
> bg-> //Her popper en liste af metoder op indeholdende: GoToHell(),
> //Lame() og Spy() da det er de eneste funktioner, som kan
> //tilgåes globalt på objektet.
>
> Hvis du i implementeringen af en funktion på BillGates klassen skrev
> this-> ville samme liste poppe op men den ville også indeholde de
> funktioner som er protected i forfædrene og de som er private i BillGates.
Sådan *burde* det være. Men ak... sådan er det vist ikke i Visual C++.
Med mindre det er noget opsætning...
| |
Bertel Brander (29-05-2003)
| Kommentar Fra : Bertel Brander |
Dato : 29-05-03 23:04 |
|
Klaus Petersen wrote:
> Hej ng.
>
[KODE SNIP'et]
> Som der står i koden, så viser "browse info" kun metoden GoToHell fra
> interfacet INoBrainer ... og det er vel fordi bill er en pointer til et
> INoBrainer interface't.
>
> Hvis det var optimalt, ville jeg man kunne se **både** INoBrainer og ILamers
> (BillGates klassen nedarver jo fra Microsoft, og har altså implementationen
> af ILamers).
>
> Men hvordan skal det bygges op?
>
> Jeg lægger vægt på at:
>
> 1) Pointeren i main er til et interface så privates bliver skjult
> 2) At BillGates nedarver fra Microsoft, så man fra main kan nå Microsoft's
> metoder gennem BillGates.
>
> Kan nogen hjælpe ?
>
> Jeg håber i forstår problemstillingen, for det er altså lidt svært at
> forklare.
>
Jeg har ikke ret meget forstand på C++, men så vidt jeg kan ved kan du
kun se GoToHell, fordi denne er den eneste funktion i INoBrainer
class'en, og så er det ligegyldigt hvad (hvilken klasse) pointeren peger
på.
Jeg prøvede at tilføje:
((BillGates *)bill)->Spy();
i main(), så bliver Microsoft::Spy kaldt.
Hvorfor ønsker du at skjule privates mere end det du opnår med
"private:" ?
/b
| |
Klaus Petersen (29-05-2003)
| Kommentar Fra : Klaus Petersen |
Dato : 29-05-03 23:53 |
|
> Hvorfor ønsker du at skjule privates mere end det du opnår med
> "private:" ?
Nu er årsagen nok ikke så tydelig i dette lille eksempel, men princippet i
eksemplet skal bruges i en meget større perspektiv.
Årsagen er, at det virker som "flimmer" over for brugerne af klasserne.
Der er med andre ord så mange private metoder og variabler, at de relavante
funktioner "drukner". Så for at gøre det mere overskueligt, bruger jeg
interfaces til "skære" det (for brugeren) irrelevante væk.
Det virker også til U.G. indtil jeg begynder at nedarve fra en klasse.
Men måske mit interface skulle nedarve fra andre interfaces?
Jeg har til dels prøvet dette uden held... den nægter at acceptere den
nedarvede implementation af de abstrakte funktioner.
| |
Bertel Brander (30-05-2003)
| Kommentar Fra : Bertel Brander |
Dato : 30-05-03 01:22 |
|
Klaus Petersen wrote:
>>Hvorfor ønsker du at skjule privates mere end det du opnår med
>>"private:" ?
>
>
> Nu er årsagen nok ikke så tydelig i dette lille eksempel, men princippet i
> eksemplet skal bruges i en meget større perspektiv.
>
> Årsagen er, at det virker som "flimmer" over for brugerne af klasserne.
>
> Der er med andre ord så mange private metoder og variabler, at de relavante
> funktioner "drukner". Så for at gøre det mere overskueligt, bruger jeg
> interfaces til "skære" det (for brugeren) irrelevante væk.
>
> Det virker også til U.G. indtil jeg begynder at nedarve fra en klasse.
>
> Men måske mit interface skulle nedarve fra andre interfaces?
>
> Jeg har til dels prøvet dette uden held... den nægter at acceptere den
> nedarvede implementation af de abstrakte funktioner.
>
>
Problemet er at der ikke er nogen link mellem en klassen ILamers og
klassen INoBrainer, så du kan ikke bruge en pointer af den ene type
til at få access til en funktion i den anden klasse (uden at lave en
beskidt type-cast).
Du er (så vidt jeg kan se) nød til at lave denne link, ved at lave en
interface klasse der arver fra både ILamers og INoBrainer, Microsoft
og derved BillGates er så desværre nødt til at arve fra denne interface
klasse hvilket (så vidt jeg kan se) var det du ville undgå. Den pointer
du bruger i main skulle så være af denne interface klasse.
/b
| |
|
|