Newsgroup: it.comp.java
Titolo: Visibilità di default ed ereditarietà

Ciao a tutti, ho una domanda forse per voi scontata, ho spulciato 
nell'ultimo migliaio di thread ma non ho trovato niente di simili, 
quindi eccomi qua:
Sono costretto a ereditare un certo numero di classi per fornire 
un'implementazione concreta (per dirla tutta, si tratta delle classi per 
la gestione degli AttributeCertificate nella libreria BouncyCastle)...
Il problema è che le classi base sono piuttosto "vuote" (seppure non 
dichiarate abstract), hanno giusto qualche metodo getter, qualcuna manca 
di costruttore...ma il problema maggiore è che i data member hanno tutti 
visibilità di default...Quindi ero giunto alla conclusione che bastasse 
mettere le mie classi concrete nello stesso package per poterne avere la 
visibilità...Tutto contento ho scritto qualche (molte!) bella paginetta 
di codice, tutto corretto in compilazione, ma al run del programma di 
test che mette tutto insieme ecco la delusione:
"java.lang.SecurityException: class 
"org.bouncycastle.asn1.x509.AttributeCertificate"s signer information 
does not match signer information of other classes in the same package"
Quindi non posso inserire le mie classi nel package di partenza? 
Esistono modi per aggirare queste limitazioni?
O sono costretto a fare un orribile "copia & incolla" (alla faccia di 
Java e dell'ereditarietà)?
Grazie in anticipo ai volenterosi che hanno letto fin qui e a quelli che 
vorranno rispondere!
Enzo

evito la lunga quotatura...
non ho ben capito una cosa, ma xkè le vuoi x forza mettere nel jar le
tue classi? non puoi semplicemente importare il jar nella tua
applicazione?
ThePeach

Grazie per l'interessamento!

Forse mi sono spiegato male...Il problema è che io non conoscevo questo 
tipo di visibilità; l'importazione del jar la faccio già (per usare 
altre classi), ma se provo a estendere alcune di queste mi ritrovo con 
un pugno di mosche in mano: se la classe figlia si trova in un altro 
package, non vede i fields della superclasse...insomma è restrittivo 
come se fossero stati dichiarati private...
Riporto il codice, tagliando le parti non necessarie; una delle classi 
base che voglio estendere è:
//----------------
package org.bouncycastle.asn1.x509;
import org.bouncycastle.asn1.ASN1EncodableVector;
// etc., altri import
public class ObjectDigestInfo implements DEREncodable
{
     DEREnumerated       digestedObjectType;
     DERObjectIdentifier otherObjectTypeID;
     AlgorithmIdentifier digestAlgorithm;
     DERBitString        objectDigest;
     public DEREnumerated getDigestedObjectType()
     {
         return digestedObjectType;
     }
............
// altri metodi get
     public DERObject getDERObject()
     {
         ASN1EncodableVector  v = new ASN1EncodableVector();
         v.add(digestedObjectType);
         if (otherObjectTypeID != null)
         {
             v.add(otherObjectTypeID);
         }
         v.add(digestAlgorithm);
         v.add(objectDigest);
         return new DERSequence(v);
     }
}
Come vedi è senza costruttore; se provo a scrivere qualcosa del tipo:
import org.bouncycastle.asn1.x509.ObjectDigestInfo;
import org.bouncycastle.asn1.DEREnumerated;
public class FakeObjectDigestInfo extends 
org.bouncycastle.asn1.x509.ObjectDigestInfo {
     public FakeObjectDigestInfo() {
         this.digestedObjectType = new DEREnumerated(0);
     }
}
In compilazione ho l'errore:
C:\ac>javac FakeObjectDigestInfo.java
FakeObjectDigestInfo.java:6: digestedObjectType is not public in 
org.bouncycastle.asn1.x509.ObjectDigestInfo; cannot be accessed from 
outside package
         this.digestedObjectType = new DEREnumerated(0);
         ^
1 error
Se invece includo la mia classe nello stesso package della classe base, 
riesco a vedere i membri default (un po' come se stessero nella stessa 
dir), in compilazione è ok, ma in run da il messaggio che ho riportato 
nel mio post precedente...
Per adesso ho scelto di fare copia e incolla, magari se in seguito 
qualcuno riesce a darmi un suggerimento allora cambierò...
Ciao
Enzo