2010-11-22 17 views
3

Meine Anwendungsklasse verwendet eine Bibliothek, in der zwei Standardvariablen enthalten sind.Gibt es eine Möglichkeit, eine Variable aus der Superklasse wegzulassen?

// A class from framework: 

public class SuperClass implements Serializable { 

    private long id; 
    private long version; 

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

} 

Ich sollte diese Klasse erweitern, um auf einige der Funktionen des Frameworks zuzugreifen.

Wenn ich diese Klasse zu meiner eigenen Klasse wie folgt erweitern:

public class MyClassChild extends SuperClass { 

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

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

} 

Gemäß dem Programmiermodell sind diese beiden Variablen ebenfalls zugänglich. Bei der Implementierung einer Operation, die ein Objekt vom Typ SuperClass erfordert.

Gibt es eine Idee, diese SuperClass zu erweitern, die diese beiden Variablen (id, version) nicht enthält?

Ich weiß nicht, was zu tun ist?

Irgendwelche Vorschläge pls?

Danke

+2

Wie sind diese Variablen in Ihrer Kindklasse sichtbar? Sie werden als privat erklärt, nicht geschützt. –

+2

Ich vermute, Sie verwenden dies mit einem ORM-Framework wie Hibernate oder JPA? Die einzige Möglichkeit, diese Variablen zu sehen, ist die Reflexion. Wollen Sie diese Variablen nicht in Ihrer Unterklasse beibehalten? –

+0

Genau Mann. Wie kann man diese zwei Variablen nicht beibehalten? –

Antwort

1

Im allgemeinen JPA nicht lassen Sie übergeordnete Klasse Zuordnungen außer Kraft gesetzt Attribute zu entfernen, aber je nach Anbieter kann es möglich sein, Folgendes zu tun:

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

Darüber hinaus ist es Es ist auch möglich, die Werte einzelner Spalten in einer zugeordneten Superklasse mit der @AttributeOverride Annotation zu überschreiben, z

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

    private String some column; 
    ... 
} 
+0

mein Problem ist mit Variablenname. Ich möchte nicht die 'Id' als ID und 'Version' als Version haben. Ich meine, ich möchte einen anderen Namen haben. –

+0

Meinst du die Spaltennamen in der Tabelle oder die tatsächlichen Methodennamen in deiner Klasse oder beides? –

+0

Wenn ich irgendeine Operation 'select, insert oder anyone' ausführe, werden diese beiden Variablen 'id' und 'version' in der Datenbanktabelle erwartet. Wenn jedoch '' in persistence.xml hinzugefügt wird, werden diese beiden Variablen direkt zugeordnet, um die Spalte der Datenbanktabelle zu erstellen. Was ich tun wollte, ist, dass ich meinen Primärschlüssel etwas wie für ex: "EMP_ID" anstelle von "ID" verwende, und "Version" ist kein großes Problem. –

1

Nein. Wenn Sie erben, erhalten Sie die gesamte Klasse mitzukommen. Wenn Sie nicht alle Felder erben möchten, entwerfen Sie keine Unterklasse.

Stellen Sie sich vor, was passieren würde, wenn Sie Variablen weglassen könnten - was würden geerbte Methoden über den jetzt fehlenden Zustand machen? Alles würde brechen ...

+0

Kann diese Art von Operationen nicht erreicht werden? –

+0

Nein, es kann nicht erreicht werden. – dteoh

1

Alles, was Sie dazu tun können, ist, diese Variable privat für die Superklasse zu machen, damit Unterklassen sie nicht "sehen".

0

Wenn Sie eine Klasse erweitern, fügen Sie angeblich weitere Variablen und Methoden hinzu, die Sie nicht subtrahieren können.

3

Sie können diese Felder nicht entfernen, aber Sie können die Getter und Setter außer Kraft setzen, um etwas anderes als die Standardeinstellung zu tun (dies hängt von ihren Zugriffsmodifizierern ab, aber sie werden wahrscheinlich protected oder höher sein). Auf diese Weise können Sie beispielsweise die externe Zuweisung dieser Variablen stoppen. Wenn Sie diese Route wählen, würde ich vorschlagen, dass Sie sich mit den Möglichkeiten vertraut machen, wie diese Felder in der Oberklasse verwendet werden, damit Sie jegliches Knock-On-Verhalten antizipieren können.

Verwandte Themen