Zugriff auf private-attribut

Cherry07

Mitglied
Hallo,
habe da ein Problem mit einer Aufgabenstellung und weiss nicht recht wie ich es lösen kann.
Kann mir mal da jdm bitte helfen?
In einer Oberklasse habe ich ein Attribut autor, welches private sein soll und in einer abgeleiteten klasse von der Unterklasse von Oberklasse soll man mit dem attribut autor arbeiten.

Code:
// Oberklasse:
...
private autor;
...
// abgeleitete Klasse von der Unterklasse v. Oberklasse:
...
Map<String, Object> map = TagReader.readTags(fname);
String tagAutor = (String) map.get ("autor");
if ( !(tagAutor.equals(null)) )
{
     // wenn der tagAutor ungleich null ist, wird das Attribut autor mit tagAutor gleichgesetzt 
     autor = tagAutor;
}

so das Problem ist, das es mir autor unterringelt, da autor aus der Oberklasse ja private ist (autor sollte bis auf weiteres lt. Aufgabenstellung private bleiben).
Ich weiss, dass wenn man auf das Attribut autor über eine setter-methode zugreifen kann.
Habe den Code dann so geschrieben.
Code:
public void setAutor(String autor)
{
     if (! (tagAutor.equals(null)) )
     {
           this.autor = tagAutor;
     }
}    // aber funktioniert nicht, woran liegt das?

vielen dank im voraus leute.
 

DealeyLama

Mitglied
Hallo,

kannst Du mir das hier

In einer Oberklasse habe ich ein Attribut autor, welches private sein soll und in einer abgeleiteten klasse von der Unterklasse von Oberklasse soll man mit dem attribut autor arbeiten.

bitte noch mal erklären? Irgendwie hab' ich nicht verstanden was du meinst...
Auf ein als 'private' deklariertes Attribut kann man nicht direkt zugreifen. Das ist ja Sinn dieser Deklaration.
Erklär doch bitte einfach noch mal, was Du eigentlich vor hast. Vielleicht fällt mir dann was ein.

Schönen Tag noch

Alexander Schell
 

zeja

Erfahrenes Mitglied
Das was du suchst ist protected. Protected erlaubt den Zugriff aus dem selben Package und allen abgeleiteten Klassen.

Zumindest wenns für dich okay ist dass man aus dem eigenen Package darauf zugreifen kann.
 

Cherry07

Mitglied
ich würd es ja gern mit protected, aber lt. Aufgabenstellung ist es nicht erlaubt.
In der Oberklasse A hab ich folgendes stehen:
Code:
static class A
{
//...
private String autor;

    public String getAutor()
    {
        return author;
    }
    
    public void setAutor(String a)
    {
        author = a;
    }
//...
}
____

abstract class B
extends A
{
     //...
}

____

public class C
extends B
{
   String tagAutor = (String) map.get("autor");
        
        if ( !(tagAutor.equals(null)) )
        {
           autor = tagAutor;
        }
   //...
}

Fehler: autor wird mit der Fehlermeldung: "The field AudioFile.autor is not visible.".
Wie kann ich dieses Problem ohne autor auf protected zu setzen lösen.

Vielen Dank.
Ein schönes Wochenende noch.
cherry07
 

DealeyLama

Mitglied
Hallo,

tut mir leid, aber irgendwie verstehe ich nicht, was das soll. Wo kommt denn die Map her? Und was ist denn jetzt die richtige Schreibweise des Attributs? 'author' oder 'autor'? Bist Du auch sicher, daß die Klasse A als statisch deklariert sein muß?

Poste doch einfach mal die gesamte Aufgabe, damit man mal einen Blick darauf werfen kann...

Schönen Abend noch

Alexander Schell
 

zeja

Erfahrenes Mitglied
Ja die Aufgabenstellung würde wahrscheinlich einiges an Erhellung bringen hier.... getter und setter könntest du aber ansonsten auch protected machen.

Achja abgesehen davon heißt es Feld und nicht Attribut in Java.
 

Cherry07

Mitglied
ich poste mal ein Ausschnitt der Aufgabenstellung:

Oberklasse AF hat die Attribute: autor, titel vom Typ String und soll private sein
abgeleitete Klasse von AF heiss SF und hat zwei abgeleitete Klassen TF und WF

grobe Zusammenfassung der Teilaufgabe 1:
In der Teilaufgabe 1 soll autor und titel aus einem Pfad extrahiert werden, und so zurückgegeben werden
Code:
return author + " - " + title;

Teilaufgabe 2:
die abgeleitete Klasse von SF, also TF soll nun im Konstruktor die ID3-Tags auswerten. ID3-Tags sind beschreibende Methoden in der Audiodatei wie Titel, Interpret, Album,...
Um an den Wert des ID3-Tags "titel" zu kommen, wird folgende Codezeile in den Konstruktor von TF eingefügt:

Code:
 Map<String, Object> map = TagReader.readTags(pfadname);
String tagTitel = (String)map.get("titel")

falls tagTitel ungleich null ist, können Sie das Attribut "titel" mit diesem Wert setzen. Gleiches gilt für autor.

Der Code sieht bei mir so aus:
Code:
String tagTitel = (String) map.get("titel");
        if ( !(tagTitel.equals(null)) )
        {
           titel = tagTitel;
        }
        
        String tagAutor = (String) map.get("autor");
        
        if ( !(tagAuthor.equals(null)) )
        {
           autor = tagAutor;
        }

nur kann ich in TF nicht auf autor bzw. titel zugreifen, da es private ist (würde es ja gerne protected machen, darf ich aber nicht).
 

zeja

Erfahrenes Mitglied
Aber die Benutzung von gettern und settern ist dir nciht verboten, also mach dass doch so.
 

Cherry07

Mitglied
ja, hab den Code dann so geschrieben
es werden keine Fehlermeldungen mehr angezeigt, aber falls ich die getter- und setter-Methoden falsch verwendet habe, bitte ich um eine Verbesserung.
Vielen Dank und einen schönen Sonntag noch.

Gruß
Cherry

in AF:
Code:
//...
private String autor;
//...
public String getAutor()
    {
        return autor;
    }
    
    public void setAutor(String a)
    {
        autor = a;
    }
//...

und in TF dann so:
Code:
//...
String tagAutor = (String) map.get("autor");
        
        if ( !(tagAutor.equals(null)) )
        {
           //autor = tagAutor;
           setAutor(tagAutor);
        }
//...