/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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


Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408193
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste