Autor Beitrag
Adrjan
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 21.07.17 10:39 
Hallo zusammen,

ich habe die folgenden beiden exemplarischen Klassen:
1. Aufgabe
2. Lohn
Die Klassen Aufgabe <>-- Lohn sollen untereinander mit einer Komposition verbunden sein. Wurde die Komposition in den nachfolgenden Klassen korrekt umgesetzt? Könnt ihr mir erklären, wie die Komposition hier umgesetzt wurde? Gibt es alternativen, die Komposition zu implementieren?

Klasse Aufgabe
ausblenden 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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TEST
{
    class Aufgabe
    {
        public Aufgabe(Date datum, int nr, Lohn leistung)
        {
            this.datum = datum;
            this.mitarbeiternummer = nr;
            this.leistung = leistung;
        }
        Date datum;
        int mitarbeiternummer;
        Lohn  leistung;

        public String getInfos()
        {
            return "MA mit der Nummer " + mitarbeiternummer  + " erhält ein Gehalt über " + leistung.gehalt () + " Euro";
        }
    }
}


Klasse Lohn
ausblenden 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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TEST
{
    class Lohn
    {
        public Lohn(double gehalt, int traifNummer )
        {
            this.gehalt = gehalt;
            this.traifNummer = traifNummer ;
        }
            double gehalt;
            int traifNummer;
        public int tarif()
        {
            return traifNummer;
        }
        public double gehalt()
        {
            return gehalt;
        }
    

    }
}


Ich bin leider noch ziemlich neu im Bereich Programmierung und hangele mich von Thema zu Thema.
Evtl. könnt ihr mir hier weiterhelfen?

Ich bin für jede Hilfe dankbar!

Eine Aggregation wäre so, oder?
ausblenden C#-Quelltext
1:
2:
3:
4:
namespace TEST
{
    class Lohn : Aufgabe
    {


ist eine Aggregation gleichzeitig eine Vererbung?
Was könnte man dieses C#-Konstrukt erklären bzw. was ist das?


Viele Grüße
Adrjan
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 21.07.17 12:42 
Hey,

die Artikel auf Wikipedia erklären es ziemlich gut: Assoziation, Aggregation

1. Die Komposition wurde nicht korrekt umgesetzt. Für eine Komposition ist eine 1 zu 1..* Beziehung nötig. Jeder Aufgabe ist zwar ein Lohn zugeordnet, aber nicht jedem Lohn ist auch eine Aufgabe zugeordnet. Das bedeutet, der Lohn kann ohne Aufgabe existieren. Da eine Komposition aber eine "ist-Teil-von" Assoziation darstellt, müsste der Lohn exakt einen Verweis auf eine Aufgabe haben. Dadurch wäre eine Komposition gegeben. Die Aufgabe wiederum könnte (muss aber nicht) auch mehrere Löhne haben.

2. Eine Aggregation beschreibt eine Beziehung, bei der Objekte zueinander zugeordnet, aber nicht zwangsläufig voneinander abhängig sind. Es ist also eine * zu 1..* Beziehung. Da es sich bei der Aggregation auch um eine "ist-Teil-von" Beziehung handelt, ist das Aggregatobjekt (in deinem Fall wäre das die Klasse Aufgabe) von seinen Teilobjekten (die andere Seite der Verbindung, hier: Lohn) abhängig. Andersrum ist dies aber nicht der Fall. Sollte also ein Lohn gelöscht werden, würde zwangsläufig auch die Aufgabe gelöscht. Würde jedoch eine Aufgabe gelöscht, könnte der Lohn nach wie vor fortbestehen.

Die Assoziation zwischen den beiden Klassen ist also weder Komposition noch Aggregation.

Vererbung steht hierbei auch in keinem Zusammenhang zu Assoziationen welcher Art auch immer.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler


Zuletzt bearbeitet von C# am Fr 21.07.17 12:58, insgesamt 1-mal bearbeitet
Adrjan Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 21.07.17 12:56 
Hallo,

vielen Dank für Deine Antwort.

Zu 1) Wie würde denn mein C#-Beispiel als Komposition aussehen?
Könntest Du es entsprechend anpassen, dass würde mir wahrscheinlich helfen das besser nachzuvollziehen.

Die jetzige Implementierung entspricht dann einer Aggregation? Korrekt?

Zu 2)
Mein Beispiel zur Aggregation entspricht dann wahrscheinlich einer Vererbung, korrekt?

Zitat:
Vererbung steht hierbei auch in keinem Zusammenhang zu Assoziationen welcher Art auch immer.

Stimmt, ist mir gerade auch klar geworden. Ich hatte hier wahrscheinlich die UML-Notation falsch gelesen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4057
Erhaltene Danke: 842

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Fr 21.07.17 12:57 
Bei einer Komposition sollte die Klasse selbst das Unterobjekt anlegen (und nicht als Konstruktorparameter übergeben bekommen).
Adrjan Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 21.07.17 13:00 
Zitat:
Bei einer Komposition sollte die Klasse selbst das Unterobjekt anlegen (und nicht als Konstruktorparameter übergeben bekommen).


Wie würde das in c# aussehen?
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 21.07.17 13:01 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
class Aufgabe
    {
        public Aufgabe(Date datum, int nr)
        {
            this.datum = datum;
            this.mitarbeiternummer = nr;
            this.leistung = new Lohn(1000010000this);
        }
        Date datum;
        int mitarbeiternummer;
        Lohn  leistung;

        public String getInfos()
        {
            return "MA mit der Nummer " + mitarbeiternummer  + " erhält ein Gehalt über " + leistung.gehalt () + " Euro";
        }
    }

ausblenden 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:
 class Lohn
    {
        public Lohn(double gehalt, int traifNummer, Aufgabe aufgabe )
        {
            this.gehalt = gehalt;
            this.traifNummer = traifNummer ;
            Aufgabe = aufgabe;
        }
            double gehalt;
            int traifNummer;
        public int tarif()
        {
            return traifNummer;
        }
        public double gehalt()
        {
            return gehalt;
        }

        public Aufgabe Aufgabe { get; }
    

    }


Dein Beispiel könnte tatsächlich eine Aggregation darstellen.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Adrjan Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 21.07.17 13:09 
@C#

Vielen Dank!
Könntest Du noch kurz erklären, wie Du hier die 1 zu 1..* Beziehung (Komposition) nun hergestellt hast?
Ich versuche es dann mal mit meinem Beispiel (Aggregation) zu vergleichen.
Ich denke so wird das Ganze dann klarer für mich.

Gibt es eigentlich einfache Mustervorlagen in C# in der man sich AGGREGATION, KOMPOSITION, Vererbung etc. beispielhaft ansehen kann bzw. testen kann?
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 21.07.17 13:13 
Also C# Templates gibt es keine dafür (soweit mir bekannt ist). Die (in diesem Fall) 1 zu 1 Beziehung besteht dadurch, dass beide Klassen sich nun kennen (durch den neuen Konstruktorparameter in Lohn). Dadurch dass Lohn die Aufgabe im Konstruktor bekommt, kann kein Lohn erzeugt werden ohne ihm eine Aufgabe zuzuordnen. Wie Th69 schon gesagt hat, sollte das Kompositionsobjekt seine Unterobjekte selbst anlegen. Deshalb habe ich den Lohn als Konstruktorparameter aus Aufgabe genommen.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Adrjan Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 21.07.17 13:33 
Danke Dir! Ich versuche mich mal weiter in die Materie einzuarbeiten.
Evtl. kommen dann noch weitere Fragen.
Adrjan Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 22.07.17 12:21 
Hallo,
ich habe jetzt für die Klasse Lohn noch zwei Klassen erstellt, die mit dieser vererbt sein sollen (siehe folgende):

Klasse Tarif:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
class Tarif : Lohn
    {
        public Tarif(String Name, double gehalt, int tarifNummer) : base(gehalt, tarifNummer)
        {
            this.Name = Name;
        }
        String Name;
    }


Klasse Sonder:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
class Sonder : Lohn
    {
        public Sonder(String SonderName, double gehalt, int tarifNummer) : base(gehalt, tarifNummer)
        {
            this.SonderName= SonderName;
        }
        String SonderName;
    }


Ich habe dazu folgende Fragen:

Wurde hier die Vererbung korrekt umgesetzt?

Gibt es Alternativen diese Vererbung umzusetzen?

Wie würde der Code aussehen, wenn die Klasse Lohn gleichzeitig eine Komposition zur Klasse „Tarif“ hat und eine Vererbung zur Klasse „Sonder“ hat?

Nochmals vielen Dank!

Viele Grüße
Adrjan Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 25.07.17 18:15 
Hat jemand eine Antwort für meine Frage(n).
Würde mir wirklich sehr weiterhelfen.
Nochmals herzlichen Dank für jede Hilfe/ jeden Beitrag!

VG

Adrjan