Toon posts:

[Java] Inner class probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb een klasse (waaraan ik niets kan veranderen)

Java:
1
2
3
4
5
6
7
8
public class X
{
        protected class Y
        {
        protected Y()
           {}
        }
}


en dan heb ik min klasse waarin ik overerf van X

Java:
1
2
3
4
5
6
7
public class A extends X
{
        public void test()
        {
        Y y = new Y();
        }
}


Het instantieren van Y lukt dus niet (Y y = new Y();)
Iemand enig idee?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

probeer eens X.Y y = new X.Y();

?

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

Alarmnummer

-= Tja =-

Wat is de foutmelding?

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Ik heb het even geprobeerd maar bij mij werkt het wel 8)7

Java:
1
2
3
4
5
public class Start {
    public static void main(String args[]) {
        Z z = new Z();
    }
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
public class X {
    
    protected class Y {
        protected Y() {

        }
        
        public String test() {
            return "hoi";
        }
    }
}


Java:
1
2
3
4
5
6
public class Z extends X {
    public Z() {
        Y y = new Y();
        System.out.println(y.test());
    }
}


Ik krijg hier netjes "hoi" als ouput... of zie ik iets over het hoofd?

Verwijderd

Topicstarter
wasigh

de X.Y y = new X.Y(); werkt niet

en de foutmelding is
Error The constructor DefaultGraphSelectionModel.CellPlaceHolder(Object, boolean) is not visible

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Waar komt die constructor ineens vandaan?
ik zie boven in je code alleen X en Y

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

Alarmnummer

-= Tja =-

Verwijderd schreef op 25 September 2003 @ 12:03:
wasigh

de X.Y y = new X.Y(); werkt niet

en de foutmelding is
Error The constructor DefaultGraphSelectionModel.CellPlaceHolder(Object, boolean) is not visible
Ik mag hieruit opmaken dat je met jgraph werkt?

Verwijderd

Topicstarter
Ja die X en die Y zijn de klasses om het uit te leggen, hij vind dus de constructor van Y niet

Verwijderd

Topicstarter
ik werk idd met jgraph

Verwijderd

Topicstarter
Amras
bij mij werkt het dus absoluut niet

welke versie van java gebruik jij (ik 1.4.1)?

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

Alarmnummer

-= Tja =-

Verwijderd schreef op 25 September 2003 @ 12:11:
Ja die X en die Y zijn de klasses om het uit te leggen, hij vind dus de constructor van Y niet
Laat de code eens zien van die constructors.

[offtopic]
Ik heb zelf ook met jgraph moeten werken (en binnenkort weer), maar wat een vervelend systeem is dat zeg. Je weet niet wat voor objecten je binnenkrijgt (allemaal 'Object' namelijk) en verder is de documentatie ook zwaar naadje.

en
code:
1
2
3
4
5
6
7
8
9
class A{
    protected class B{}        
}

class X extends A{
       X(){
           B b = new B();
       }
}

Doet het hier ook goed.

[ Voor 16% gewijzigd door Alarmnummer op 25-09-2003 12:18 ]


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Hier op school gebruiken we 1.4.2.... Lijkt me trouwens niet dat ze zoiets veranderen in 1 kleine update, maar je zou ff kunnen kijken wat de verschillen zijn.

Verwijderd

Topicstarter
dit is de code van die constructor
vrij normaal op het eerste zicht
protected CellPlaceHolder(Object cell, boolean isNew)
{
this.cell = cell;
this.isNew = isNew;
}

idd,
tis veel zoeken met jgraph, maar het biedt wel een aantal krachtige functies aan

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Tja... aan die constructor kan weinig fout... :|

Verwijderd

Topicstarter
ik zou wel eens willen proberen met de 1.4.2,
ik ben hem aan het downloaden,
er is echter een probleem, die versie is er niet op unix,
dus dat gaat dan wel problemen geven

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Ik denk niet dat dat veel gaat uitmaken, heb ff snel gekeken naar de nieuwe features van 1.4.2 maar daarin staat niks over dit probleem. Lijkt me ook te essentieel om in zo'n mini-update te gaan veranderen. Voor de zekerheid: Alarmnummer, welke versie gebruik jij.

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

Alarmnummer

-= Tja =-

Amras schreef op 25 September 2003 @ 12:34:
Ik denk niet dat dat veel gaat uitmaken, heb ff snel gekeken naar de nieuwe features van 1.4.2 maar daarin staat niks over dit probleem. Lijkt me ook te essentieel om in zo'n mini-update te gaan veranderen. Voor de zekerheid: Alarmnummer, welke versie gebruik jij.
1.4.2

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uhm, het is toch logisch :?
Java:
1
2
3
4
5
6
7
8
public class X 
{ 
        protected class Y 
        { 
        protected Y() 
           {} 
        } 
}


De constructor van Y is protected, wat wil zeggen dat ie alleen te gebruiken is in Y zelf of in subclasses van Y

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


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

Alarmnummer

-= Tja =-

.oisyn schreef op 25 september 2003 @ 12:42:
Uhm, het is toch logisch :?
Java:
1
2
3
4
5
6
7
8
public class X 
{ 
        protected class Y 
        { 
        protected Y() 
           {} 
        } 
}


De constructor van Y is protected, wat wil zeggen dat ie alleen te gebruiken is in Y zelf of in subclasses van Y
In een subclass van X, X_sub is Y ook beschikbaar omdat Y protected is. Je zou door ook gewoon de constructor van Y moeten kunnen aanroepen (en dat kan ik hier dus ook).

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Alarmnummer schreef op 25 September 2003 @ 12:50:
[...]

In een subclass van X, X_sub is Y ook beschikbaar omdat Y protected is. Je zou door ook gewoon de constructor van Y moeten kunnen aanroepen (en dat kan ik hier dus ook).
Nee, want jij gebruikt
Java:
1
2
3
4
5
6
7
8
9
class A{
    protected class B{}        
}

class X extends A{
       X(){
           B b = new B();
       }
}

en daarbij is de default constructor niet protected, maar wordt 'ie door Java zelf toegevoegd en heeft hij dus geen modifiers.

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
de constructor van de innerclass is wel protected

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

Alarmnummer

-= Tja =-

Vladimir G. schreef op 25 September 2003 @ 12:54:
[...]

Nee, want jij gebruikt
Java:
1
2
3
4
5
6
7
8
9
class A{
    protected class B{}        
}

class X extends A{
       X(){
           B b = new B();
       }
}

en daarbij is de default constructor niet protected, maar wordt 'ie door Java zelf toegevoegd en heeft hij dus geen modifiers.
Idd je hebt gelijkt.

Ik heb het nog even een keer erin gezet en ik krijg idd een foutmelding.

[semiofftopic]
Ik gebruik innerclasses zelf nooit op deze manier. Innerclasses zijn bij mij in principe nooit bedoelt om vanuit een andere class aan te roepen (daarom is bij mij iedere innerclass altijd private). Ik gebruik ze voornamelijk om listener zaken ed op aan te sluiten.

Verwijderd

Topicstarter
ja,
er is niet veel aan te doen, dat die definitie zo is gebeurd,
maar het is dus niet mogelijk om die class te instantieren?

Verwijderd

Topicstarter
Ok,
nu probeer ik het zo

Java:
1
2
3
4
5
6
7
8
public class X 
{ 
        protected class Y 
        { 
        protected Y() 
           {} 
        } 
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class A extends X 
{ 
        public void test() 
        { 
        T t = new T(); 
        } 

        public class T extends Y
        {
        public T()
        {
         super();
         }
        }
}

Verwijderd

Topicstarter
Verwijderd schreef op 25 September 2003 @ 13:36:
Ok,
nu probeer ik het zo

Java:
1
2
3
4
5
6
7
8
public class X 
{ 
        protected class Y 
        { 
        protected Y() 
           {} 
        } 
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class A extends X 
{ 
        public void test() 
        { 
        T t = new T(); 
        } 

        public class T extends Y
        {
        public T()
        {
         super();
         }
        }
}
Iemand enig idee dat ik hiermee onverwachte resultaten kan verwachten?

.modbreak: zou je wat vaker van de editknop gebruik willen maken? Dan wordt de topic niet onnodig gekicked enzo. Tx :)

[ Voor 12% gewijzigd door .oisyn op 25-09-2003 15:36 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21-08 14:03

Robtimus

me Robtimus no like you

Java:
1
2
3
4
5
6
7
8
9
10
public class X
{
    protected class Y
    {
        protected Y()
        {
            System.out.println("bla");
        }
    }
}
Java:
1
2
3
4
5
6
7
8
9
10
11
12
public class A extends X
{
    public void test()
    {
        new Y();
    }

    public static void main(String args[])
    {
        (new A()).test();
    }
}
Als ik nu class A uitvoer, dan zie ik gewoon bla :?

(jdk 1.4.2_01)

[ Voor 4% gewijzigd door Robtimus op 25-09-2003 19:09 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, omdat ze nu in dezelfde package staan. Zo werkt het niet:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// p/X.java

package p;

public class X 
{ 
    protected class Y 
    { 
        protected Y() 
        { 
            System.out.println("bla"); 
        } 
    } 
}


// A.java
public class A extends p.X 
{ 
    public void test() 
    { 
        new Y(); 
    } 

    public static void main(String args[]) 
    { 
        (new A()).test(); 
    } 
}


error:
code:
1
2
3
4
A.java:5: Y() has protected access in p.X.Y
        new Y();
        ^
1 error


als iets protected is, is het namelijk bereikbaar voor alles in dezelfde package, en voor alle subclasses van de class. Maar aangezien A geen subclass is van Y, en A ook niet in dezelfde package staat als Y

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

misschien is het verstandig om het design eens te herzien...

in de regel moet je niet willen dat je een inner class buiten de outer class wordt aan ge roepen.
- het verhoogd echt niet de readability van de code

als ik een inner class design dan heeft deze class een directe relatie met de outer class en alleen met deze classe. Als dit niet het geval is dan bouw ik niet een inner class.

terugzettend in jou probleem zou ik met het beperkte inzicht wat ik heb in jou code, die inner class omzetten naar een gewone class

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21-08 14:03

Robtimus

me Robtimus no like you

Verwijderd schreef op 26 September 2003 @ 09:10:
misschien is het verstandig om het design eens te herzien...

in de regel moet je niet willen dat je een inner class buiten de outer class wordt aan ge roepen.
- het verhoogd echt niet de readability van de code

als ik een inner class design dan heeft deze class een directe relatie met de outer class en alleen met deze classe. Als dit niet het geval is dan bouw ik niet een inner class.

terugzettend in jou probleem zou ik met het beperkte inzicht wat ik heb in jou code, die inner class omzetten naar een gewone class
Hier ben ik het niet mee eens.
Voor zover ik het zie is het ook de bedoeling dat deze inner class alleen in class X wordt gebruikt, en subclasses van class X. Die subclasses erven dus class Y omdat ie protected is ipv private.

Wat gebeurt er trouwens als je de constructor van Y niet protected maakt? Class Y is nog steeds protected, dus de visibility van class Y zou gelijk moeten blijven, alleen kun je hem nu ook instantieren als je hem kan zien. In het geval dat .oisyn aankaart kan dat nu niet altijd.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Die protected constructor is ook de hele reden waarom het niet werkt, omdat ie buiten de namespace alleen zichtbaar is voor subclasses van Y

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Zoals te zien in mijn tot hierna laatste post werkt het wel,
kweet niet dat dat een ideale opzet is.
Pagina: 1