[Java]Extenden en overerven

Pagina: 1
Acties:
  • 129 views sinds 30-01-2008
  • Reageer

  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Ik heb een vraagje over het extenden van bestaande classes. Stel je voor ik heb een class gemaakt met allemaal handige functie's en die noem ik MObject (dus net zoiets als java.lang.Object) en ik extend nu altijd MObject als ik een nieuwe class aanmaak zodat ik altijd die functie's heb.

Nu heb ik nog een class gemaakt die dus MObject extend en daar het ik nog een paar extra functie in gepropt die ook wel handig zijn maar die ik niet altijd nodig heb en die noem ik MSubObject.

Ok, nu de stelling. Ik moet kiezen tussen deze 2 classes welke ik ga gebruiken om altijd te extenden welke moet ik dan kiezen? Nog enkele punten om het wat duidelijker te maken.

- MObject heeft functie's die ik altijd wil kunnen gebruiken
- MSubOjbect heeft functie's die ik bij sommige classes nodig heb
- als ik voor MObject kies mag ik nooit MSubOjbect extenden en andersom

Maakt het trouwens sowieso iets uit als ik MSubObject kies in verband met geheugen gebruik omdat hij extra functie's heeft?

Als ik nog nie duidelijk genoeg ben laat me het ff weten.

http://www.slobmotorsport.nl - iRacing Profiel


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als je de functionaliteit van MSubObject nodig bent (die dus ook de functionaliteit van MObject in zich heeft) dan extend je toch gewoon van MSubObject? Jouw object heeft dus alle eigenschappen van MSubObject + indirect ook alle eigenschappen van MObject.

En maak ik me niet om het extra geheugen verbruik omdat het een class is die verder op de inheritance ladder zit.

  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Alarmnummer schreef op 22 november 2002 @ 14:48:
Als je de functionaliteit van MSubObject nodig bent (die dus ook de functionaliteit van MObject in zich heeft) dan extend je toch gewoon van MSubObject? Jouw object heeft dus alle eigenschappen van MSubObject + indirect ook alle eigenschappen van MObject.

En maak ik me niet om het extra geheugen verbruik omdat het een class is die verder op de inheritance ladder zit.
dus het is juist gunstiger om MSubOjbect te gebruiken in verband met geheugen verbuik?

ennuh als ik dus voor MSubOjbect kies mag nooit meer MOjbect extenden, ookal heb ik die functie's van MSubOjbect niet nodig.

Maar dat maakt dus niks uit?

[ Voor 14% gewijzigd door Linc op 22-11-2002 14:53 ]

http://www.slobmotorsport.nl - iRacing Profiel


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik weet eerlijk gezegd niet of dat wat uitmaakt. Maar waarom maak je je zo druk om geheugen verbruik? Als je echt op geheugen verbruik wilt letten moet je gewoon lekker in c ofzo gaan proggen.

  • cablepokerface
  • Registratie: Januari 2001
  • Laatst online: 29-01 16:53
inherit van MObject en maak een instantie van MSubObject als je die functies nodig heb ...

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

the_Emperor schreef op 22 November 2002 @ 14:51:
ennuh als ik dus voor MSubOjbect kies mag nooit meer MOjbect extenden, ookal heb ik die functie's van MSubOjbect niet nodig.
Hmmzz.. volgens mij kan wel het een en ander opgehelderd worden als je even precies aangeeft wat je bedoelt. Dus even een voorbeeldje aub.

  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
cablepokerface schreef op 22 november 2002 @ 14:53:
inherit van MObject en maak een instantie van MSubObject als je die functies nodig heb ...
Ja maar dan heb ik dus 2 keer MObject in me in me class zitten, dan heb ik dus dubbele functie's

http://www.slobmotorsport.nl - iRacing Profiel


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

the_Emperor schreef op 22 november 2002 @ 14:55:
[...]
Ja maar dan heb ik dus 2 keer MObject in me in me class zitten, dan heb ik dus dubbele functie's
Volgens mij gaan er een aantal elementaire zaken fout :) Je krijgt dus echt niet meerdere dezelfde functies in je class hoor. En vind ik zijn antwoord erg onduidelijk dus ik denk niet dat je er al te veel op moet letten (tenzij hij verduidelijkt wat hij bedoelt).

  • whoami
  • Registratie: December 2000
  • Nu online
cablepokerface schreef op 22 November 2002 @ 14:53:
inherit van MObject en maak een instantie van MSubObject als je die functies nodig heb ...


Hmm... Dit is een beetje van het goede teveel imho.

Misschien is het wel het beste om te gaan blackboxen.
Je maakt een class die niet inherit van MObject en ook niet van MSubObject, maar een data-member heeft van het type MObject. Dan ga je aan die datamember ofwel een object van MObject ofwel een object van MSubObject gaan toekennen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
private MObject _obj;

public MyClass( int a )
{
   if( a == 1)
   {
      _obj = new MObject();
   }
   else
   {
      _obj = new MSubObject();
   }
}

https://fgheysels.github.io/


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Whoami, dit is wel een wat geavanceerdere oo constructie. Dit is voor hem denk ik op dit moment te hoog gegrepen. Er gaan nog een aantal elementaire zaken fout, en dat moet echt eerst opgelost worden.

  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
whoami schreef op 22 November 2002 @ 14:56:

[...]


Hmm... Dit is een beetje van het goede teveel imho.

Misschien is het wel het beste om te gaan blackboxen.
Je maakt een class die niet inherit van MObject en ook niet van MSubObject, maar een data-member heeft van het type MObject. Dan ga je aan die datamember ofwel een object van MObject ofwel een object van MSubObject gaan toekennen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
private MObject _obj;

public MyClass( int a )
{
   if( a == 1)
   {
      _obj = new MObject();
   }
   else
   {
      _obj = new MSubObject();
   }
}
hmmm .... maar dan heb ik eigenlijk geen van class die 2 classes geextend, maar dan heb ik een object in me class die wel die functie's heeft (afhankelijk van de int)?

Maar als ik nu wel iets wil extenden welke van de 2 is dan de beste keuze

http://www.slobmotorsport.nl - iRacing Profiel


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

*heeft in dit topic nog niet een keer het woord interface en polymorphisme horen vallen, hoop dat iemand daar nog wel even melding van gaat maken*

en verder gaat dit topic ook een vrij vage kant op. Geen duidelijke antwoorden, geen duidelijke vragen.

  • whoami
  • Registratie: December 2000
  • Nu online
Alarmnummer schreef op 22 November 2002 @ 15:08:
*heeft in dit topic nog niet een keer het woord interface en polymorphisme horen vallen, hoop dat iemand daar nog wel even melding van gaat maken*

en verder gaat dit topic ook een vrij vage kant op. Geen duidelijke antwoorden, geen duidelijke vragen.


Nou, de term polymorphisme is nog niet expliciet vermeld idd.... Maar het is toch wel al eens gebruikt. ;)

Verder vind ik dit ook maar een vaag topic.

https://fgheysels.github.io/


  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Alarmnummer schreef op 22 November 2002 @ 15:08:
*heeft in dit topic nog niet een keer het woord interface en polymorphisme horen vallen, hoop dat iemand daar nog wel even melding van gaat maken*

en verder gaat dit topic ook een vrij vage kant op. Geen duidelijke antwoorden, geen duidelijke vragen.
een interface gebruik je toch altijd bij een EventListener ?

Ok, nog even ter verduidelijking:

- dat MObject en dat MSubObject zijn classes die ik niet zelf geschreven heb, maar al bestaan dus daar kan ik niks meer aan veranderen
- ik moet dus een keuze maken tussen die 2 welke ik ATLIJD moet ik extenden

Wat is dus de beste keuze?

http://www.slobmotorsport.nl - iRacing Profiel


  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

the_Emperor schreef op 22 November 2002 @ 15:13:
[...]
een interface gebruik je toch altijd bij een EventListener ?
Nee, een interface is iets waarvan je weet hoe je het moet aanroepen terwijl je niet bent geinteresseerd in de implementatie daarvan. Kijk maar eens in de documentatie van de bijvoorbeeld Collection en de andere Collections classes in java.util voor wat ideeen.
Ok, nog even ter verduidelijking:

- dat MObject en dat MSubObject zijn classes die ik niet zelf geschreven heb, maar al bestaan dus daar kan ik niks meer aan veranderen
- ik moet dus een keuze maken tussen die 2 welke ik ATLIJD moet ik extenden
Wat is dus de beste keuze?
De beste keuze is het object dat de functionaliteit biedt die je nodig hebt. De vraag die je stelt is nogal vaag. Je kunt als je functionaliteit van MObject nodig hebt toch van MObject extenden en in andere gevallen van MSubObject? Ik snap jouw probleem niet, geloof ik. Geef maar een concreet voorbeeld, want dit schiet niet op.

With the light in our eyes, it's hard to see.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Bobco schreef op 22 november 2002 @ 15:24:
De beste keuze is het object dat de functionaliteit biedt die je nodig hebt. De vraag die je stelt is nogal vaag. Je kunt als je functionaliteit van MObject nodig hebt toch van MObject extenden en in andere gevallen van MSubObject? Ik snap jouw probleem niet, geloof ik. Geef maar een concreet voorbeeld, want dit schiet niet op.
_/-\o_

  • whoami
  • Registratie: December 2000
  • Nu online
Bobco schreef op 22 november 2002 @ 15:24:
[...]


De beste keuze is het object dat de functionaliteit biedt die je nodig hebt. De vraag die je stelt is nogal vaag. Je kunt als je functionaliteit van MObject nodig hebt toch van MObject extenden en in andere gevallen van MSubObject? Ik snap jouw probleem niet, geloof ik. Geef maar een concreet voorbeeld, want dit schiet niet op.


Idd. Je kunt toch at design time gaan bepalen welke functionaliteit een klasse nodig heeft?

https://fgheysels.github.io/


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik denk dat hier het beste niet aan symptoom bestrijding gedaan kan worden, maar gewoon de oorzaak van het probleem oplossen. Er gaat geloof ik iets fundamenteels mis en dat moet opgelost worden, en niet zijn voorbeeld. Maar om te begrijpen wat hij niet begrijpt moeten we eerst weten wat hij niet begrijpt. Dus voorda iedereen met allerlei praktisch advies komt. eerst achterhalen wat hij niet begrijpt

  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Ok ik ben niet duidelijk genoeg geweest wat ik dus met ALTIJD bedoel.

Namelijk dat ik weer een nieuw Class (MIJNObject) ga maken met nog extra functionaliteit (die niet in die andere 2 classes staan, maar die wel altijd nodig is) en dan is de bedoeling dat ik MIJNObject altijd ga gebruiken. ennuh als ik dus nieuwe class gemaakt heb MIJNObject ofzo kan ik dus niet tijdens het programmeren in 1 keer die ander class gaan kiezen want dan heb ik de functionaliteit van MIJNObject dus niet meer ....

Owh ennuh dat MObject en MSubOjbect zijn classes die ik nie geschreven heb en dus ook niks aan kan veranderen

Misschien ben ik wel helemaal verkeerd aan het denken hoor ik weet het ook niet ...

[ Voor 10% gewijzigd door Linc op 22-11-2002 15:45 ]

http://www.slobmotorsport.nl - iRacing Profiel


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Geef anders even een stukje code, want ik kan hier niet veel uit opmaken. (Je hoeft de inhoud van methodes niet te laten zien, dus je mag alles tussen {} weghalen.

[ Voor 39% gewijzigd door Alarmnummer op 22-11-2002 15:47 ]


  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Alarmnummer schreef op 22 November 2002 @ 15:46:
Geef anders even een stukje code, want ik kan hier niet veel uit opmaken. (Je hoeft de inhoud van methodes niet te laten zien, dus je mag alles tussen {} weghalen.
wat wil je met een stukje code, want het maakt eigenlijk niks uit wat er in de classes staat?

- Ik heb 2 Bestaande Classes (MObject en MSubObject) waar ik niks meer aan kan veranderen.
- Ik ga een nieuw proprgramma maken.
- Ik heb de functie's uit MObject (bijna) altijd nodig.
- Ik heb de functie's uit MSubObject soms nodig.
- Ik heb nog extra functie's (bijna) altijd nodig en die defineer ik in MIJNObject.
- Nu is de keuze als ik dat MIJNObject maak of ik MObject extend of MSubObject.
- Als ik die keuze gemaakt heb kan ik niet meer op de ander overstappen omdat ik dan de functie's uit MIJNObject niet meer heb.

Duidelijk ? ik hoop het ....

http://www.slobmotorsport.nl - iRacing Profiel


Verwijderd

Ok, denk dat ik begrijp wat je wilt, je wilt telkens je eigen class met je eigen methoden extenden. Deze class wil je op zijn beurt weer laten extenden van MObject of MSubObject. En je vraagt ons welke je het best kunt kiezen.

Maar waarom wil je al deze mogelijkheden in 1 object hebben. Je zou toch gewoon twee instanties kunnen hebben, 1 voor MObject of MSubObject en 1 voor je eigen object zodra je deze nodig hebt. Kan me niet voorstellen dat je al deze functionaliteit in elk object gaat geberuiken.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Is it just me, of probeert de TS procedureel te programmeren in Java :?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Verwijderd schreef op 22 november 2002 @ 16:05:
Ok, denk dat ik begrijp wat je wilt, je wilt telkens je eigen class met je eigen methoden extenden. Deze class wil je op zijn beurt weer laten extenden van MObject of MSubObject. En je vraagt ons welke je het best kunt kiezen.

Maar waarom wil je al deze mogelijkheden in 1 object hebben. Je zou toch gewoon twee instanties kunnen hebben, 1 voor MObject of MSubObject en 1 voor je eigen object zodra je deze nodig hebt. Kan me niet voorstellen dat je al deze functionaliteit in elk object gaat geberuiken.
Ja jij begrijpt het zo ongeveer jah.

en ik zou 2 instanties kunnen maken, maar dan heb ik functies dubbel staan en dat is toch niet de bedoeling van object georiënteerd programmeren?

http://www.slobmotorsport.nl - iRacing Profiel


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

laatste poging, een stukje code. En anders zoek je het zelf maar uit.

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

the_Emperor schreef op 22 November 2002 @ 16:01:
[...]
wat wil je met een stukje code, want het maakt eigenlijk niks uit wat er in de classes staat?
Omdat een regel code meer kan zeggen dan ellenlange verhalen. Verder laat een stukje code zien wat jij tot nu toe zelf hieraan hebt gedaan.
- Ik heb 2 Bestaande Classes (MObject en MSubObject) waar ik niks meer aan kan veranderen.
- Ik ga een nieuw proprgramma maken.
- Ik heb de functie's uit MObject (bijna) altijd nodig.
- Ik heb de functie's uit MSubObject soms nodig.
- Ik heb nog extra functie's (bijna) altijd nodig en die defineer ik in MIJNObject.
- Nu is de keuze als ik dat MIJNObject maak of ik MObject extend of MSubObject.
- Als ik die keuze gemaakt heb kan ik niet meer op de ander overstappen omdat ik dan de functie's uit MIJNObject niet meer heb.
Duidelijk ? ik hoop het ....
Waarom (zoals Webmaniac ook al lijkt te vragen) moeten al die functies perse in die ene class gepropt worden? Verder snap ik niet hoe je opeens de functies van MIJNObject kwijt kunt zijn als je van A of B extend.

Voorbeeldje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class A {
  public void functieA() {}
  public void functieB() {}
}

public class B extends A {
  public void functieC() {}
}

public class jouwClass extends B {
  public void jouwFunctieA() {}
  public void jouwFunctieB() {}
}


Je hebt nu in jouwClass de beschikking over alle functionaliteit van A, B en jouwClass. Dat is toch wat je wilt?

With the light in our eyes, it's hard to see.


  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Bobco schreef op 22 November 2002 @ 16:17:
...

Voorbeeldje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class A {
  public void functieA() {}
  public void functieB() {}
}

public class B extends A {
  public void functieC() {}
}

public class jouwClass extends B {
  public void jouwFunctieA() {}
  public void jouwFunctieB() {}
}


Je hebt nu in jouwClass de beschikking over alle functionaliteit van A, B en jouwClass. Dat is toch wat je wilt?
Klopt helemaal maar mijn vraag is of het dus stom is om class B te extenden (met veel extra functionaliteit die ik niet altijd nodig heb) te extenden.

En ik kan nu wel gewoon class A extenden en dan van class B een nieuwe instantie maken als ik hem nodig heb, maar krijg ik dan niet dubbele functies namelijk die van class A en nog een keer van class A die geextend word door class B.

http://www.slobmotorsport.nl - iRacing Profiel


Verwijderd

waarom maak je niet een MIJNObject en een MIJNSubObject die je resp. extend van MObject en MSubObject? dan gebruik je MIJNObject en MIJNSubObject als parentclass afhankelijk van de functionaliteit die je nodig hebt.

  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
Verwijderd schreef op 22 November 2002 @ 16:34:
waarom maak je niet een MIJNObject en een MIJNSubObject die je resp. extend van MObject en MSubObject? dan gebruik je MIJNObject en MIJNSubObject als parentclass afhankelijk van de functionaliteit die je nodig hebt.
zie mijn vorige post

en ja ik denk dat dat de beste oplossing is gezien de replies

http://www.slobmotorsport.nl - iRacing Profiel


  • Linc
  • Registratie: December 2000
  • Laatst online: 19-02 12:07
whoami schreef op 22 November 2002 @ 14:56:

[...]


Hmm... Dit is een beetje van het goede teveel imho.

Misschien is het wel het beste om te gaan blackboxen.
Je maakt een class die niet inherit van MObject en ook niet van MSubObject, maar een data-member heeft van het type MObject. Dan ga je aan die datamember ofwel een object van MObject ofwel een object van MSubObject gaan toekennen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
private MObject _obj;

public MyClass( int a )
{
   if( a == 1)
   {
      _obj = new MObject();
   }
   else
   {
      _obj = new MSubObject();
   }
}
ik heb er nog eens diep overnagedacht O-) en ik denk dat ik zoeits moet hebben.

ik wil het volgende hebben:

MObject is de hoofdclass en kan ik niet veranderen

De volgendende classes zijn allemaal geextend op MObject (deze classes kan ik ook niet meer veranderen):

MSub1Object
MSub2Object
MSub3Object
MSub4Object
MSub5Object

Nu wil ik dus d.m.v. een variable of door casten kunnen kiezen welke class ik extend op mijn eigen MIJNObject

is dit sowieso mogelijk of moet ik voor elke subojbect een aparte class maken?

stukje voorbeeld code van wat ik hoop dat kan:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (a = 0){
    public class CSNObject extends MSub1Object{
}
else if (a = 1){
    public class CSNObject extends MSub2Object{
}
else if (a = 2){
    public class CSNObject extends MSub3Object{
}
else if (a = 3){
    public class CSNObject extends MSub4Object{
}
else if (a = 4){
    public class CSNObject extends MSub5Object{
}


dit kan dus niet, maar ik hoop dat er een ander constructie is die dat wel kan.

En misschien kan het ook d.m.v. het casten van classes dus:

MObject:
Java:
1
2
3
4
5
6
7
8
9
public class MObject {
    
    public MObject(String variable) {
        
    }

    //stelletje functies
    
}


MSub1Object en de rest van de subojbecten met een ander naampie (en andere functies).

Java:
1
2
3
4
5
6
7
8
9
public class MSub1Object extends MObject{
    
    public MSub1Object(String variable) {
        super(variable);
    }

    //stelletje functies
    
}


MIJNObject:

Java:
1
2
3
4
5
6
7
8
9
public class MIJNObject extends MObject{
    
    public MIJNObject(String variable) {
        super(variable);
    }
    
    //stelletje functies
  
}


Nu een test class waar ik MIJNObject in aanroep
Java:
1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
    
    public Test() {
        MIJNObject object1 = (MIJNObject) new MObject("test"); // dit kan wel. 
        MIJNObject object2 = (MIJNObject) new MSub1Object("test"); // dit kan niet.
        MIJNObject object3 = (MIJNObject) new MSub2Object("test"); // dit kan niet.
        MIJNObject object4 = (MIJNObject) new MSub3Object("test"); // dit kan niet.
        MIJNObject object5 = (MIJNObject) new MSub4Object("test"); // dit kan niet.
        MIJNObject object6 = (MIJNObject) new MSub5Object("test"); // dit kan niet.
    }
    
}


Het casten van de subojecten gaat nu dus niet, hoe krijg ik dit wel voor mekaar?

http://www.slobmotorsport.nl - iRacing Profiel


  • whoami
  • Registratie: December 2000
  • Nu online
[nohtml]
the_Emperor schreef op 28 november 2002 @ 10:25:
[...]


ik heb er nog eens diep overnagedacht O-) en ik denk dat ik zoeits moet hebben.

ik wil het volgende hebben:

MObject is de hoofdclass en kan ik niet veranderen

De volgendende classes zijn allemaal geextend op MObject (deze classes kan ik ook niet meer veranderen):

MSub1Object
MSub2Object
MSub3Object
MSub4Object
MSub5Object

Nu wil ik dus d.m.v. een variable of door casten kunnen kiezen welke class ik extend op mijn eigen MIJNObject

is dit sowieso mogelijk of moet ik voor elke subojbect een aparte class maken?

stukje voorbeeld code van wat ik hoop dat kan:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (a = 0){
    public class CSNObject extends MSub1Object{
}
else if (a = 1){
    public class CSNObject extends MSub2Object{
}
else if (a = 2){
    public class CSNObject extends MSub3Object{
}
else if (a = 3){
    public class CSNObject extends MSub4Object{
}
else if (a = 4){
    public class CSNObject extends MSub5Object{
}
Dat kan dus niet. Op het moment van compilen moet er bekend zijn welke classes er gedefinieerd worden, en dat ga jij hier dus nu at-runtime willen forceren.
Dit is eigenlijk ook wel ranzig.
In talen zoals C++ heb je 'compiler directives' waarmee je kunt aangeven wat er wel en niet moet gecompileerd worden (maar dit is dan afhankelijk van zogenaamde conditional defines). Ik weet niet of dat in Java mogelijk is, maar ik denk niet dat als het al mogelijk is, het al uitkomst biedt voor jouw probleem. Jij wilt nl. at runtime gaan bepalen welke class je definieert.
Ik snap trouwens nog altijd niet goed wat jouw probleem is. Je wilt at runtime classes definieren? Je kan toch gewoon die classes definieren, en als je at-runtime een instance van die class nodig hebt, dan maak je er een instance van. Heb je geen instance nodig, dan maak je er geen.
dit kan dus niet, maar ik hoop dat er een ander constructie is die dat wel kan.
Dat heb je goed gezien ja. :+

https://fgheysels.github.io/


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
the_Emperor schreef op 28 November 2002 @ 10:25:
ik heb er nog eens diep overnagedacht O-) en ik denk dat ik zoeits moet hebben.
Wat jij nu aan het doen bent heeft niets te maken met het wrappen van een object :)
ik wil het volgende hebben:

MObject is de hoofdclass en kan ik niet veranderen

De volgendende classes zijn allemaal geextend op MObject (deze classes kan ik ook niet meer veranderen):

MSub1Object
MSub2Object
MSub3Object
MSub4Object
MSub5Object

Nu wil ik dus d.m.v. een variable of door casten kunnen kiezen welke class ik extend op mijn eigen MIJNObject

is dit sowieso mogelijk of moet ik voor elke subojbect een aparte class maken?

stukje voorbeeld code van wat ik hoop dat kan:
Simpelweg NIET mogelijk. Van een class moet @ compiletime bekend zijn wat zijn structuur is en dat is het gewoon simpelweg niet op jouw manier :) Je zult dus van te voren moeten kiezen welke class extended wordt. Het lijkt me ook heel raar. Je krijgt dan classes die @ runtime kunnen veranderen van functie?

Let op dat het ongeveer wel kan met wrapping. Je kan dan in je MObject wel variabeles van subobjects stoppen, echter je kun dan alleen de overridden functies van de subobjects gebruiken niet de nieuwe.

Een andere manier is om @ compile time een macro er overheen te zetten
Java:
1
2
#IF_DEF MSubObject2
public class MyObject extends MSubObject2

Je haalt dan wel een preprocessor over je code heen die je zelf moet schrijven. Echter de beslissing moet je dan wel nemen @ compile time.
En misschien kan het ook d.m.v. het casten van classes dus:

MObject:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
    
    public Test() {
        MIJNObject object1 = (MIJNObject) new MObject("test"); // dit kan wel. 
        MIJNObject object2 = (MIJNObject) new MSub1Object("test"); // dit kan niet.
        MIJNObject object3 = (MIJNObject) new MSub2Object("test"); // dit kan niet.
        MIJNObject object4 = (MIJNObject) new MSub3Object("test"); // dit kan niet.
        MIJNObject object5 = (MIJNObject) new MSub4Object("test"); // dit kan niet.
        MIJNObject object6 = (MIJNObject) new MSub5Object("test"); // dit kan niet.
    }
    
}
Je probeert nu een sub-object van MObject te casten naar een ander sub-object van MObject, die totaal verschillend zijn. Dat is NIET mogelijk!
Het enige wat je kan doen is alles casten naar een MObject, echter dan kun je alleen de methodes gebruiken die in MObject zitten of overridden zijn in het sub-object.

Blijft gewoon overreind dat je het beste gewoon niet kan extenden maar de boel in een wrapper class (factory) te stoppen. Je wrapt dan in elke class je MObject of MSubObject, echter dit kun je dus @ runtime veranderen.

edit:
Ik heb trouwens het hele topic niet gelezen, alleen even hier op gereageerd, ik denk dat ik dan ook dubbel typ werk heb gedaan.

Misschien ook een tip -> Kijk in het /14 boekentopic en zoek een mooi boek over de princiepes van OO uit :)

[ Voor 6% gewijzigd door Glimi op 28-11-2002 10:49 ]

Pagina: 1