java, initialiser le sous-classe de super-classe
public class Base {
//long list of attributes
//no Constructor using fields
//no init methode
//i cannot change this class
}
maintenant, j'ai étendu la Classe de Base comme:
public class subClass extends Base{
private boolean selected;
...
getter und setter
...
}
je deviens une liste d'objet de Base List<Base>
mais j'ai besoin de la même liste, mais comme List<SubClass>
est-il un moyen d'initialiser le sous-classe de la Classe de Base?
exemple:
for(Base b: list){
SubClass sub = (SubClass)b; //Thats wrong i know
if(...){
sub.setSelected(true);
}
newList.add(sub);
}
j'essaie d'éviter le manuel de l'initialisation de chaque Attribut de la Base de Class
à la sous-classe
- je mettre à jour ma Question, comme demandé dans les Commentaires:
le dessin ci-dessus est juste un exemple. ma QUESTIN EST EXACTEMENT:
pourquoi la conversion de BaseClass dans la sous-classe (sence Subclass extends BaseClass
) n'est pas Possible? pourquoi Java dosn pas me permettre de faire ce qui suit:
exemple:
Class Base{
private String name;
.....
}
Class SubClass extends Base{
private String title;
}
puis
Base b = DBController.getById(...);
SubClass sub = (SubClass)b;
après que l'Objet sub
devrait avoir le Nom de l'Attribut de l'Objet b
et le title
Attribut est nulle
pourquoi ce n'est pas le cas en java?
désolé pour mon mauvais anglais,
grâce
Où est le
List<Base>
champ défini? Dans le Base
classe elle-même? Avez-vous le contrôle sur l'endroit où ses déclarée, et comment sa initialisé?Je vous suggère fortement de regarder dans "préfèrent la Composition au cours de l'héritage"--google. Vous trouverez des discussions intéressantes sur la question. Je dis seulement ceci, parce qu'il semble que vous essayez désespérément de l'abus de ce privilège.
Comment pouvez-vous éviter le manuel de l'initialisation de la classe de Base des attributs si la Base n'a pas de constructeur ou une méthode d'initialisation? Êtes-vous en train d'essayer de convertir une classe de Base dans une Sous-classe?
oui @Jake, c'est exactement ce que je suis en train de faire
OriginalL'auteur Rami.Q | 2013-04-04
Vous devez vous connecter pour publier un commentaire.
Si vous avez un
List<Base>
, alors vous ne pouvez pas convertir unList<SubClass>
. C'est principalement parce que la liste ne peut pas contenir des instances deSubClass
. Le meilleur que vous pouvez faire est:En général, cependant, lorsque vous vous retrouver à faire ce genre de chose, il ya quelque chose de mal avec votre conception. Vous voudrez peut-être éviter de sous-classement
Base
et à l'aide de composition à la place.MODIFIER en Fonction de vos commentaires, on dirait que vous voulez construire une liste de
SubClass
instances à l'aide d'une liste deBase
instances comme un début. Une approche consiste à définir un constructeur deSubClass
qui prend unBase
comme un argument.Alors vous pouvez construire votre nouvelle liste:
je veux dire, après la coulée de la sous-classe doit avoir tous les attributs de la Classe de Base et le reste des Attributs dans la sous-classe serait nulle
Ok, vos commentaires clarifié pour moi quelque chose à propos de ce que vous voulez. J'ai révisé ma réponse à cette adresse.
merci pour votre réponse. je l'ai accepté, parce que je fais de cette façon. mais ce n'est pas la meilleure solution. Oracle devrait nous donner une Conversion automatique de la Classe de Base dans la sous-classe. quelque chose comme des Attributs de l'UNION.
OriginalL'auteur Ted Hopp
Il y a un moyen: Divers Java Beans spec base de manipulation.
Par exemple:
Communes BeanUtils
Cela fonctionne basé sur get/setters du même nom. Ne copie pas les champs internes.
Si vous avez besoin de copier des champs internes, il est en fait pas si difficile à mettre en œuvre à l'aide de
javax.lang.reflect
.OriginalL'auteur Ondra Žižka
Vous semblez avoir une classe avec beaucoup d'attributs et pas de moyen facile de le faire. Vous avez maintenant de fonctionner dans un problème où vous avez besoin d'une classe avec un attribut supplémentaire, mais vous avez à traiter avec ce désordre d'une classe de base.
Je suggère que, au lieu de créer une sous-classe et de moulage, vous créez une classe wrapper autour de la laide:
Maintenant, quand vous avez à créer cette nouvelle liste, vous pouvez envelopper le tout dans la vieille liste
Idéalement, BigDumbClass serait de mettre en œuvre une interface qui Wrapper pourrait aussi mettre en place, permettant le wrapper de reporter tous les appels à l'instance, il a enveloppé.
Sinon, vous pouvez fournir une lecture à l'instance et y accéder directement.
OriginalL'auteur Jake Greene