Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2006 Teil von August

SELFHTML Forumsarchiv
Vererbungsgeschichte

Informationsseite
  1. Seite (JAVA) Vererbungsgeschichte von nimble, 30. 08. 2006, 20:21
nach unten

Vererbungsgeschichte

Die folgende Nachricht zum Thema stammt von: nimble, 30. 08. 2006, 20:21

Hi
Ich bin gerade über die Vererbung gestolpert. Hier mal der Code:

public abstract class TableElement
{
    private String name, value;
    private boolean hasCondition, sort, desc;

    public String getName()
    {
        return this.name;
    }
}


public class StringCell extends TableElement
{
    private String name, value;
    private boolean hasCondition, sort, desc;

    public StringCell(String name)
    {
        this.name = name;
    }
}


Wenn ich also eine Instanz der Klasse StringCell habe und getName aufrufen sollte sich diese bei der Oberklasse bedienen und mir den Namen erzählen...

TableElement nameCell = new StringCell("name");
System.err.println("Der Name der Klasse ist "+nameCell.getName());


Die Antwort lautet: «Der Name der Kasse ist null»

kann mir jemand sagen warum und was ich ändern muss, damit ich in der Unterklasse die Funktionen der Abstrakten Klasse nicht implementieren muss?

THX
--
ie:} fl:( br:> va:) ls:& fo:# rl:( n4:? ss:) de:] js:| ch:? sh:) mo:? zu:)
------------------------------
lieber ein Pinguin der läuft
als ein Fenster das hängt
------------------------------

nach obennach unten

Vererbungsgeschichte

Die folgende Nachricht zum Thema stammt von: Cheatah, 30. 08. 2006, 20:37

Hi,

»»
»» public abstract class TableElement
»» {
»»     private String name, value;
[...]
»» public class StringCell extends TableElement
»» {
»»     private String name, value;
[...]

»» kann mir jemand sagen warum und was ich ändern muss, damit ich in der Unterklasse die Funktionen der Abstrakten Klasse nicht implementieren muss?

keine privaten Member erzeugen und befüllen, auf die die Vaterklasse keinen Zugriff hat. Neben "private" und "public" gibt es übrigens auch "protected".

Cheatah

--
X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes

nach obennach unten

Vererbungsgeschichte

Die folgende Nachricht zum Thema stammt von: nimble, 30. 08. 2006, 21:01

Hi

»» keine privaten Member erzeugen und befüllen, auf die die Vaterklasse keinen Zugriff hat. Neben "private" und "public" gibt es übrigens auch "protected".

aber wenn das das Proble wäre, würde es mit Public funktionieren...
Kann es daher kommen, dass Beide Vater & Kind die Variable name haben?
müsste dann bei der Vaterklasse sowas wie child.name stehen?

THX
--
ie:} fl:( br:> va:) ls:& fo:# rl:( n4:? ss:) de:] js:| ch:? sh:) mo:? zu:)
------------------------------
lieber ein Pinguin der läuft
als ein Fenster das hängt
------------------------------

nach obennach unten

Vererbungsgeschichte

Die folgende Nachricht zum Thema stammt von: Bernhard, 30. 08. 2006, 21:37

Hi!

»» Kann es daher kommen, dass Beide Vater & Kind die Variable name haben?

Der Variablenname ist in diesem Fall egal: Beide Instanzvariablen sind privat; daher können beide Klassen jeweils nur auf den in ihnen selbst definierten „name“n zugreifen.

»» müsste dann bei der Vaterklasse sowas wie child.name stehen?

Das geht bei Instanzvariablen nicht.

Gruß
Bernhard

nach obennach unten

Vererbungsgeschichte

Die folgende Nachricht zum Thema stammt von: Daniel Thoma, 30. 08. 2006, 23:01

Hallo Bernhard,

»» »» müsste dann bei der Vaterklasse sowas wie child.name stehen?
»»
»» Das geht bei Instanzvariablen nicht.
Es ist aber problemlos möglich, per super.name auf eine überschriebene Eigenschaft der Elternklasse zuzugreifen. Prinzipiell sollte man natürlich keine Eigenschaften gleichen Namens verwenden, wenn sie nicht als "private" deklariert sind.

Grüße

Daniel

nach obennach unten

Vererbungsgeschichte

Die folgende Nachricht zum Thema stammt von: Daniel Thoma, 30. 08. 2006, 21:04

Hallo nimble,

Darauf, dass Du auf private deklarierte Eigenschaften in Kind-Klassen nicht zugreifen kannst, hat Cheatah dich ja schon hingewiesen. Außerdem hast Du die Eigenschaften ja auch noch neu deklariert.

Du solltest jetzt aber nicht "protected" statt "private" verwenden, sondern die abstrakte Klasse mit einem Konstruktor versehen, der die Eigenschaften aktualisiert:

public abstract class TableElement {
   private String name, value;
   private boolean hasCondition, sort, desc;

   public TableElement(String name, String value, boolean sort,
           boolean desc, boolean hasCondition) {
      this.name = name;
      this.value = value;
      this.hasCondition = hasCondition;
      this.sort = sort;
      this.desc = desc;
   }

   public String getName() {
      return this.name;
   }
}


In einer Kindklasse musst Du dann den Konstruktor aufrufen, um die Werte zu übergeben:
public StringCell(String name) {
   super(name, ...);
}


Grüße

Daniel

nach oben
Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2006 Teil von August

© 1998-2006 Seite Impressum, Software: Classic Forum