2010-11-22 29 views
3

Ma classe d'application utilise une bibliothèque avec deux variables par défaut.Y at-il un moyen d'omettre une variable de super classe?

// A class from framework: 

public class SuperClass implements Serializable { 

    private long id; 
    private long version; 

    // getter and setter methods for these variables... 

} 

j'étendre cette classe, afin d'accéder à certaines fonctionnalités du cadre.

Si je tends cette classe à ma propre classe comme ceci:

public class MyClassChild extends SuperClass { 

    private long myprimarykey; 
    private String some column; 
    private long myversion; 

    // getter and setter methods for these variables... 

} 

Selon le modèle de programmation, ces deux variables sont également accessibles. Lors de l'implémentation nécessitant un objet de type SuperClass.

Y a-t-il une idée pour étendre cette SuperClasse qui n'inclut pas ces deux variables (id, version)?

Je ne sais pas quoi faire?

Des suggestions?

Merci

+2

Comment ces variables sont-elles visibles dans votre classe enfant? Ils sont déclarés privés, non protégés. –

+2

Je suppose que vous utilisez ceci avec un framework ORM comme Hibernate ou JPA? La seule façon de voir ces variables est la réflexion. Est-ce juste que vous ne voulez pas que ces variables persistent dans votre sous-classe? –

+0

Exactement l'homme. Comment ne pas persister ces deux variables? –

Répondre

1

En JPA générale ne permet pas de passer outre les correspondances superclasse pour supprimer les attributs, mais en fonction de votre fournisseur, il peut être possible de faire ce qui suit:

public class MyClassChild extends SuperClass { 

    private long myprimarykey; 
    private String some column; 
    private long myversion; 

    // Override superclass mappings 
    @Transient 
    long getId() { return super.getId(); } 
    @Transient 
    void setId(long id) { return super.setId(long id); } 
    // etc... 
} 

EDIT

En outre, est également possible de remplacer les valeurs des colonnes individuelles dans une superclasse mappée en utilisant l'annotation @AttributeOverride, par exemple

@AttributeOverride(name="id", [email protected](name="EMP_ID")) 
@Entity 
public class MyClassChild extends SuperClass { 

    private String some column; 
    ... 
} 
+0

mon problème est avec le nom de variable. Je ne veux pas avoir le 'Id' comme Id et 'version' comme version. Je veux dire, veux avoir un autre nom. –

+0

Voulez-vous dire les noms de colonne dans la table ou les noms de méthode réels sur votre classe, ou les deux? –

+0

Lorsque j'effectue une opération 'select, insert ou n'importe quoi', ces deux variables 'id' et 'version' devraient être présentes dans la table de base de données. Mais, si ajouter '' ceci dans persistence.xml, ces deux variables sont directement mappées pour créer la colonne de la table de base de données. Ce que je voulais faire, c'est que j'ai utilisé ma clé primaire quelque chose comme par exemple: "EMP_ID" au lieu de "ID", et "version" n'est pas un gros problème. –

1

. Non Si vous héritez, vous faites venir toute la classe. Si vous ne voulez pas hériter de tous les champs, vous ne concevez pas de sous-classe. Imaginez ce qui se passerait si vous pouviez omettre des variables: que feraient les méthodes héritées à propos de l'état maintenant manquant? Tout casserait ...

+0

Impossible d'effectuer ce genre d'opérations? –

+0

Non, cela ne peut pas être réalisé. – dteoh

1

Tout ce que vous pouvez faire à ce sujet est de rendre cette variable privée à la super classe afin que les sous-classes ne le "voient" pas.

0

Lorsque vous étendez une classe, vous êtes censé ajouter plus de variables et de méthodes, vous ne pouvez pas soustraire.

3

Vous ne pouvez pas supprimer ces champs, mais vous pouvez remplacer les getters et setters pour qu'ils fassent autre chose que la valeur par défaut (cela dépend de leurs modificateurs d'accès, mais ils seront probablement protected ou supérieur). De cette façon, vous pouvez arrêter l'affectation externe de ces variables, par exemple. Si vous choisissez cette route, je vous suggère de vous familiariser avec la façon dont ces champs sont utilisés dans la superclasse afin que vous puissiez anticiper tout comportement indésirable.