Entwickler-Ecke

Basistechnologien - Frage zur Vererbung


Raorkon - Do 09.07.09 16:49
Titel: Frage zur Vererbung
Ich habe mich bisher nur am Rande mit OO-Technologie beschäftigt. Nun will ich aber die vererbungsmöglichkeit besser verstehen und lernen.

In meinen neuen Projekt habe ich mir mir eine Message-Klasse erstellt und wollte diese nun als abstrakt definieren da ich weitere Klassen generieren will, die die Attribute der Messageklasse haben soll, aber auch weitere eigene Attribute haben kann. Also ein klassisches Beispiel der Vererbung. Dazu habe ich mir folgenden Code geschrieben:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
    abstract class message_class
    {
        private string id;
        private DateTime date;
        private string system_message;
        private string Ress_message;
     }

     class info_class : message_class
    {


    }



wenn ich nun eine Instanz von info_class erzeuge kann ich nicht auf die Attribute der message_class zugreifen,
was mach ich falsch? Bzw was habe ich falsch verstanden? Danke für die Aufklärung


bakachan - Do 09.07.09 16:55

private ist nur innerhalb der klasse selbst also auch nicht in erbenden klassen
Wenn in einer erbenden Klasse die Attribute auch verfügbar seien sollen musst du anstelle von private protected verwenden.


JasonDelife - Do 09.07.09 18:20

Du solltest aber wirklich nur die Meber, die der abgeleiteten Klasse zur freien Verfügung steht als protected markieren!
Also NICHT nach dem Motto: "Alles protected, wer weiß wann ich den Member mal brauche...".
Außerdem werden Klassen üblicherweise groß und ohne Präfix/Suffix (cls, class, ...) geschrieben.
Also einfach "abstract class Message" und "class Info : Message".

Grüße, JasonDelife.


Raorkon - Do 09.07.09 18:24

Also ich habe den modifier geändert allerdings kann ich immer noch nicht auf die Attr. zugreifen.


Quelltext
1:
2:
3:
4:
5:
info_class info = new info_class();
info.id = "I001";
...
...
...


also ich denke mal das man da nicht viel falsch machen kann.


jaenicke - Do 09.07.09 18:31

Wenn du von außen darauf zugreifen willst, dann musst du das public deklarieren, protected wäre ja nur innerhalb von abgeleiteten Klassen. Für public Zugriff wären aber Getter und Setter und eine echte Eigenschaft am sinnvollsten.


Raorkon - Fr 10.07.09 08:47

Hallo ,

ich habe das nun mit Getter und Setter gemacht, bis dahin hat erstmal alles funktioniert. Nun stehe ich aber vor dem nächsten Problem, ich kann aufgrund der Zugriffsberechtigung nciht auf dei Klasse zugreifen. Ich erhalte immer den Fehler Inkonsistenter Zugriff: Parametertyp "wsTest.TDATA" ist weniger zugreifbar als Methode "wsTest.Class_Operation.changeData(Test.TDATA). Nun habe ich natürlich auch ordentlich gegoogelt (oder muss ich jetzt binggen?) hab aber irgenwie nicht die passenende Antwort gefunden. So hier mal meine Code:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
    abstract class _TDATA
    {
        protected string _id;
        protected string _clientid;
        protected string _from;
        protected string _pallet;
        protected string _to;
        protected string _persid;
        protected string _bttype;
        protected string _amount;
        protected string _sync_date;
        protected string _scan_date;
        protected string _transfered;
        
        public string id
        {
            get { return _id; }
            set { this._id = id; }
        }
        usw....            
    }

    class TDATA : _TDATA
    {
        
    }


wenn ich nun die die Klasse übergeben will


Quelltext
1:
2:
3:
public void changeData(TDATA p_tdata)
{
}


erhalte ich oben genannten Fehler. Beide Codes sind im selben Namespace in unterschiedlichen Klassendateien.
Was verstehe ich falsch???


Th69 - Fr 10.07.09 09:52

Dann mußt du auch die Klasse 'TDATA' public machen (denn sosnt kannst du ja von außen keine Instanz dieser Klasse anlegen):

C#-Quelltext
1:
public class TData : ...                    

Standardmäßig ist eine Klasse als 'internal' definiert, d.h. nur innerhalb der Assembly sichtbar.

Und bitte überleg dir bessere Namen für deine Klassen. TDATA und _TDATA, da ist ja grauenvoll und in spätestens in 1 Monat weißt du selber nicht mehr, was du damit gemeint hast!!! (s.a. C# Namenskonventionen: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconnetframeworkdesignguidelines.asp)


Raorkon - Fr 10.07.09 09:58

Hallo,

ich werde mich mal über den Artikel hermachen und meine Namenskonventionen überarbeiten.
So ich habe nun meine Klasse public deklariert allerdings erhalte ich nun den selben Fehler an dieser Klasse.


Quelltext
1:
public class TData : ...                    


Raorkon - Fr 10.07.09 10:41

so ich habe erstmal eine Lösung die mir keinen Fehler mehr bringt.
Ich habe die abstrakte Klasse auf public gesetzt. Jedoch bin ich der Meinung das das nicht im Sinne des Erfinders ist.