Toon posts:

[Java] class scopes

Pagina: 1
Acties:

Verwijderd

Topicstarter
hoi Tweakers

Tijdens mijn studie over class scopes kwam ik tegen in mijn boek dat een class enkel friend en public scope kan hebben .

Nu in mijn klasses heb ik al klassen als protected gemaakt en de compiler maakte daar geen bezwaar op.

Mijn vraag nu is als ik een klasse heb die als friend gedeclareerd is in packet b
en ik wil in packet a een klasse gebruiken van die hierboven dan gaat dit niet lukken omdat de friend enkel toegang heeft tot zijn eigen package - nu ik zou die ook public kunnen zetten maar dat wil ik niet

wat is de oplossing of gaat het toch public moeten

thx

Verwijderd

Topicstarter
ohja het is enkel overerven dat ik van die klasse wil dus die mag niet toegankelijk zijn anders in een ander packet het is enkel overerven dat mag

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Naar mijn weten heb je 2 scopes voor classes. Een public scope en een package scope. Wil je vanuit package b direct gebruik maken van een class uit package a, dan moet de class uit package a een public scope hebben. Anders kan het niet volgens mij.

Zie ook de language spec.

Noushka's Magnificent Dream | Unity


Verwijderd

Het volgende werkt ook:
Java:
1
2
3
4
5
6
7
8
class foo {

// some code

  private class bar{
  // some code
  }
}


class bar is alleen te zien vanuit foo.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 03-05 20:49

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op dinsdag 02 augustus 2005 @ 11:20:
ohja het is enkel overerven dat ik van die klasse wil dus die mag niet toegankelijk zijn anders in een ander packet het is enkel overerven dat mag
offtopic:
Tip: gebruik de edit knop voor dit soort toevoegingen ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:41

momania

iPhone 30! Bam!

Ik denk dat je hier eerder moet gaan nadenken of je wel de juiste package structuur gebruikt.

Als je classes maakt die gebruikt gaan worden om afgeleiden van te maken, zullen dit vaak basis classes of abstracte classes.
Zo'n basis en/of abstracte laag plaats ik meestal in een aparte package waarin dus alle classes gewoon public kunnen zijn. Het doel van deze classes is immers om door andere te kunnen worden gebruikt en dus public te zijn.

Basis classes van bijvoorbeeld een domein laag, die je alleen binnen je eigen package zou willen gebruiken, kan je wel friend maken. Die classes zou je alleen in het hoogste niveau moeten zetten, want volgens mij betekend friend niet alleen in de zelde package, maar ook in de children.

foo.domain.BaseClass zou je als friend dus kunnen gebruiken in packages als foo.domain.xxx en foo.domain.yyy :)

[edit]
Geef anders even wat concrete voorbeelden van wat je nu hebt/wilt.

[ Voor 5% gewijzigd door momania op 02-08-2005 13:05 ]

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Topicstarter
ok dus voor toplevel klassen dus geen inner klassen enkel public en package visibility

voor inner klassen private public private protected en package
static inner klassen die moeten in hun parent klas geinitialiseerd worden door van die static inner klas dan een object te maken klopt dat ?

Verwijderd

Michali schreef op dinsdag 02 augustus 2005 @ 11:56:
Naar mijn weten heb je 2 scopes voor classes.
Je hebt er vier: public, protected, package private (default) en local.

Een voorbeeld van de laatste:

protected void someMethod() {
class SomeClass {
private String foo;
}
SomeClass someClass = new SomeClass();
someClass.foo = "bar";
}
Verder heb je nog de keuze tussen static vs non-static classes voor classes die je onderdeel maakt van een andere class. Verder kunnen member classes (zowel static als non-static) alle scopes hebben, maar kan een class gedifieerd in een file met een andere naam dan de zijne alleen maar package private zijn.

Verwijderd

voor inner klassen private public private protected en package
static inner klassen die moeten in hun parent klas geinitialiseerd worden door van die static inner klas dan een object te maken klopt dat ?
Nee. Classloader zorgt voor initialisatie van static blokken, en afhankelijk van je scope kun je objecten aanmaken waar je wil.

Verwijderd

Topicstarter
bij klassen die default visibility hebben zie je soms een constructor staan die public staat heeft toch mijns inziens toch geen nut die kan toch ook gewoon zonder public daar staan of niet?

tijdens mijn tests kan ik vanuit een ander package er toch geen klasse van maken wat logisch is want de klasse is enkel zichtbaar in het eigen packet

  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:41

momania

iPhone 30! Bam!

De zichtbaarheid van een constructor ligt in een andere scope als de zichtbaarheid van een class zelf. ;)

Een protected constructor kan je nog steeds niet gebruiken in een andere class, ook niet binnen de zelfde package.
Protected constructors kan je alleen gebruiken in de class zelf en afgeleiden daarvan.

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Topicstarter
het is raar dat je die niet in hetzelfde packet kunt gebruiken daar de conventie zegt protected is visible in het package, in de klasse zelf en in subklassen die niet in het pakket zitten toch raar dat je met een protected constructor dan geen object kunt maken in zijn eigen pakket

hier spreekt java zichzelf tegen en ik kan het ook niet echt vinden in de language specificaties echt wel raar

  • grhmpf
  • Registratie: December 2000
  • Laatst online: 29-05-2022

grhmpf

Android <3

Wel grappig dat je keer op keer een vraag stelt, en als je dan het antwoord krijgt dat je zegt "NOU DAT IS RAAR" :P Java is zeker niet perfect, maar je kunt er toch wel vanuit gaan dat het geen 10 jaar had volgehouden als alles aan de taal raar en vreemd zou zijn...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04-05 12:47

.oisyn

Moderator Devschuur®

Demotivational Speaker

het is raar dat je die niet in hetzelfde packet kunt gebruiken daar de conventie zegt protected is visible in het package
Nee, protected is niet zichtbaar in de package, protected is zichtbaar in subclasses van je class. Pas als je geen accessor specificeert is ie zichtbaar vanuit de package (en imho hadden ze hier het keyword "package" ook wel voor kunnen gebruiken, maar dat terzijde)

[ Voor 68% gewijzigd door .oisyn op 03-08-2005 12:49 ]

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
grhmpf schreef op woensdag 03 augustus 2005 @ 12:47:
Wel grappig dat je keer op keer een vraag stelt, en als je dan het antwoord krijgt dat je zegt "NOU DAT IS RAAR" :P Java is zeker niet perfect, maar je kunt er toch wel vanuit gaan dat het geen 10 jaar had volgehouden als alles aan de taal raar en vreemd zou zijn...
:-)

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

Alarmnummer

-= Tja =-

.oisyn schreef op woensdag 03 augustus 2005 @ 12:47:
[...]
Nee, protected is niet zichtbaar in de package, protected is zichtbaar in subclasses van je class. Pas als je geen accessor specificeert is ie zichtbaar vanuit de package (en imho hadden ze hier het keyword "package" ook wel voor kunnen gebruiken, maar dat terzijde)
Dat zou je wel denken. Maar het is dus niet zo. Protected heeft subclass toegang, maar is ook package friendly. Vroeger had je ook nog private protected die hetzelfde gedrag heeft als wat jij beschrijft.

[ Voor 11% gewijzigd door Alarmnummer op 03-08-2005 13:22 ]

Pagina: 1