Autor Beitrag
Raorkon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86
Erhaltene Danke: 1



BeitragVerfasst: Do 09.07.09 16:49 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86
Erhaltene Danke: 1



BeitragVerfasst: Do 09.07.09 18:24 
Also ich habe den modifier geändert allerdings kann ich immer noch nicht auf die Attr. zugreifen.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86
Erhaltene Danke: 1



BeitragVerfasst: 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:

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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):
ausblenden 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: msdn.microsoft.com/l...esignguidelines.asp)
Raorkon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86
Erhaltene Danke: 1



BeitragVerfasst: 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.

ausblenden Quelltext
1:
public class TData : ...					
Raorkon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86
Erhaltene Danke: 1



BeitragVerfasst: 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.