Autor Beitrag
DrHoas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Mo 07.12.15 19:47 
Hallo,

mir ist das objektorientierte Programmieren noch nicht so geläufig, deshalb eine wahrscheinlich recht einfache Frage:
Ich hab eine Klasse "Mensch" erstellt. Darin hab ich eine Klasse "Fertigkeiten" und darin wiederum die Klassen "KoerperlicheFertigkeiten" und "GeistigeFertigkeiten":
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
class Mensch
    {
        public class Fertigkeiten
        {
            public class KoerperlicheFertigkeiten
            {
                public int Klettern { get;set; }
                public int Schwimmen { get; set; }
            }
            public class GeistigeFertigkeiten
            {
                public int Lesen { get; set; }
                public int Rechnen { get; set; }
            }
        }
    }

Eigentlich dachte ich, dass ich jetzt nach
ausblenden C#-Quelltext
1:
Mensch mMensch = new Mensch();					

auch auf
ausblenden C#-Quelltext
1:
Mensch.Fertigkeiten.KoerperlicheFertigkeiten.Klettern					

zugreifen kann. Das ist aber nicht so. Es geht erst nachdem ich
ausblenden C#-Quelltext
1:
Mensch.Fertigkeiten.KoerperlicheFertigkeiten KFertigkeiten = new Mensch.Fertigkeiten.KoerperlicheFertigkeiten();					

erstellt habe.

Ehrlich gesagt, hab ich auch das Gefühl, dass ich komplett falsch an die Sache rangehe. Ich denke, es ist aber klar geworden, was ich eigentlich will: Ich will eine Objekt Mensch erzeugen und das muss dann meines Erachtens schon körperliche und geistige Fertigkeiten haben. Wenn mir also jemand einen guten Tipp hat, wäre ich sehr dankbar.

Grüße

Philipp

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Moderiert von user profile iconTh69: Topic aus WinForms verschoben am Mo 07.12.2015 um 19:38
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 07.12.15 20:08 
Ja. Klassen in Klassen zu definieren ist eher unüblich. Das macht man manchmal wenn die Klasse komplett intern ist. Also wenn die ~innere~ Klasse privat ist und nur von der ~äußeren~ verwendet wird.
Für eine öffentliche ~innere~ Klasse fällt mir kein sinnvoller Einsatzzweck ein.

Die Art deiner Frage lässt mich vermuten das dir der unterschied von Klassen und Instanzen von Klassen noch nicht klar ist. Mir fehlt da ein Ansatz das knapp zu erklären insofern würde ich dich da auf die Dokumentation bzw. irgendein gutes Buch verweisen das das erklärt. Was ich sagen kann und eventuell ein wenig hilft

Zitat:
Mensch mMensch = new Mensch();

Mensch.Fertigkeiten.KoerperlicheFertigkeiten KFertigkeiten = new Mensch.Fertigkeiten.KoerperlicheFertigkeiten();


mMensch und KFertigkeiten haben überhaupt keinen Zusammenhang. Weder existiert irgendeine Mensch.Fertigkeiten.KoerperlicheFertigkeiten Instanz in mMensch noch gibt es irgendeine Mensch Instanz die zu KFertigkeiten gehört. Ein Klasse ist ein reines Muster für ein noch zu erstellendes Ding egal ob direkt in einem Namespace erzeugt oder in einer Klasse. Wo es definiert wird hat nur Einfluss auf die Sichtbarkeit der Defintion.

Wenn du Mensch ein paar Eigenschaften geben willst die durch die Fertigkeiten Klasse dargestellt werden mußt du Mensch ein Property/Feld geben das eine Instanz der Klasse Fertigkeiten veröffentlicht.
Das was du erreichen wolltest sähe wohl so aus

ausblenden volle Höhe C#-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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
public class KoerperlicheFertigkeiten
{
    internal KoerperlicheFertigkeiten() { }

    public int Klettern { get;set; }
    public int Schwimmen { get; set; }
}

public class GeistigeFertigkeiten
{
    internal GeistigeFertigkeiten() { }

    public int Lesen { get; set; }
    public int Rechnen { get; set; }
}

public class Fertigkeiten
{
    internal Fertigkeiten()
    {
        KoerperlicheFertigkeiten = new KoerperlicheFertigkeiten();
        GeistigeFertigkeiten = new GeistigeFertigkeiten();
    }
    public KoerperlicheFertigkeiten KoerperlicheFertigkeiten { get; private set; }
    public GeistigeFertigkeiten GeistigeFertigkeiten{ get; private set; }
}

public class Mensch
{
    public Mensch()
    {
        Fertigkeiten = new Fertigkeiten();
    }
    public Fertigkeiten Fertigkeiten { get; private set; }
}
DrHoas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Mo 07.12.15 20:41 
Stark! Genau das wollte ich erreichen.
Ja, mir ist der Unterschied zwischen Klassen und Instanzen von Klassen nicht klar. Ich guck mal, dass ich mich da schlau mach.

Tausend Dank.

Philipp