nimble: Vererbungsgeschichte

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
------------------------------
  1. 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
    
    1. 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
      ------------------------------
      1. 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

        1. 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

  2. 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