Objektorientiertes Programmierung C Sharp
Hallo,
ich bin im Moment gerade dabei mich in die Grundlagen objektorientierter Programmierung einzulesen.
Da ich das Ganze mal anhand eines praktischen Beispiels ausprobeiren wollte bin ich auf folgendes Problem gestossen.
Zu erst zum Beispiel.
Ich gehe von folgenden vorhandens Klassen aus:
Klasse:
Person (Name,Vorname)
Adresse (Strasse,Plz,Ort)
Standort: (Ort)
Arbeitsvertrag : Standort,Urlaubsgeld
von Arbeitsvertrag abgeleitet die Klasse:
Vollzeitarbeitsvertrag: (Arbeitszeit,Entgelt)
Teilzeitarbeitsvertrag (Arbeitszeit,Entgelt,kein Urlaubsgeld)
Das Ganze ist natürlich nur ein Gedankenspiel.
Es gibt viele Personen die an einem Standort die dort
einen Vollzeit-, oder nur Teilzeitverträge abschliessen können.
Diese Personen ist unter einer Adresse gemeldet sein.
So nun zur eigentlichen Frage:
Ein Objekt Person zu erzeugen ist ja nicht das Problem.
Person p = new Person();
p.Name = "Test"; --> oder auch einfach
p.NewPerson("Test"); \\ Aufruf durch Funktion in Klasse
Was mir aber nicht klar ist:
Was muss ich tun um dieser Person einen
z.B. Teilzeitarbeitsvertrag an Standort 1 zu geben
und dessen Adresse zu speichern.
Wie muss da der Aufruf aussehen ?
Ziel ist das ich dann irgendwann das Jahresentgelt einschl. Urlaubsgeld für Person1 abfragen kann.
Z.B. So: p.Arbeitsvertrag.GetJahresgehalt();
Ich hoffe Ihr wisst was ich meine.
Ein Beispiel in Pseudocode wäre für mich erst mal ausreichend.
Vielen Dank im Voraus !!
ich bin im Moment gerade dabei mich in die Grundlagen objektorientierter Programmierung einzulesen.
Da ich das Ganze mal anhand eines praktischen Beispiels ausprobeiren wollte bin ich auf folgendes Problem gestossen.
Zu erst zum Beispiel.
Ich gehe von folgenden vorhandens Klassen aus:
Klasse:
Person (Name,Vorname)
Adresse (Strasse,Plz,Ort)
Standort: (Ort)
Arbeitsvertrag : Standort,Urlaubsgeld
von Arbeitsvertrag abgeleitet die Klasse:
Vollzeitarbeitsvertrag: (Arbeitszeit,Entgelt)
Teilzeitarbeitsvertrag (Arbeitszeit,Entgelt,kein Urlaubsgeld)
Das Ganze ist natürlich nur ein Gedankenspiel.
Es gibt viele Personen die an einem Standort die dort
einen Vollzeit-, oder nur Teilzeitverträge abschliessen können.
Diese Personen ist unter einer Adresse gemeldet sein.
So nun zur eigentlichen Frage:
Ein Objekt Person zu erzeugen ist ja nicht das Problem.
Person p = new Person();
p.Name = "Test"; --> oder auch einfach
p.NewPerson("Test"); \\ Aufruf durch Funktion in Klasse
Was mir aber nicht klar ist:
Was muss ich tun um dieser Person einen
z.B. Teilzeitarbeitsvertrag an Standort 1 zu geben
und dessen Adresse zu speichern.
Wie muss da der Aufruf aussehen ?
Ziel ist das ich dann irgendwann das Jahresentgelt einschl. Urlaubsgeld für Person1 abfragen kann.
Z.B. So: p.Arbeitsvertrag.GetJahresgehalt();
Ich hoffe Ihr wisst was ich meine.
Ein Beispiel in Pseudocode wäre für mich erst mal ausreichend.
Vielen Dank im Voraus !!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 190563
Url: https://administrator.de/contentid/190563
Ausgedruckt am: 16.11.2024 um 11:11 Uhr
6 Kommentare
Neuester Kommentar
Hi StefanLausL,
schon mal was von Vererbung gehört(gelesen)?
http://msdn.microsoft.com/de-de/library/ms228387(v=vs.80).aspx
Da der Vollzeitarbeitsvertrag Eigenschaften des Teilzeitarbeitsvertrags enthält,
könnte man auch eine Klasse Teilzeitarbeitsvertrag erstellen, und eine Klasse
Vollzeitarbeitsvertrag davon ableiten und um Eigenschaften erweitern, die in
Teilzeitarbeitsvertrag nicht enthalten sind, anstatt von einer Basisklasse zwei
Klassen abzuleiten.
Da dir Pseudocode ausreicht , mal ein Beispiel in PHP
Erzeugt man nun ein Objekt der Klasse c_teilzeit, enthält dieses die Eigenschaften
gehalt und urlaubstage. Die Klasse c_vollzeit erbt diese Eigenschaften,
und enthält außerdem urlaubsgeld und weihnachtsgeld.
Beispiel:
Ausgabe der Objektvariablen:
object(c_teilzeit)#1 (3) {
["vertrag:protected"]=>
string(8) "teilzeit"
["gehalt:protected"]=>
NULL
["urlaubstage:protected"]=>
NULL
}
object(c_vollzeit)#2 (5) {
["vertrag:protected"]=>
string(8) "vollzeit"
["urlaubsgeld:protected"]=>
NULL
["weihnachtsgeld:protected"]=>
NULL
["gehalt:protected"]=>
NULL
["urlaubstage:protected"]=>
NULL
}
Hier machst du das Gleiche. Eine Klasse Standort mit seinen Daten,
z.B. plz, ort, strasse etc. ist deine Basisklasse, die um Personendaten erweitert wird.
Da C# aber nur von einer Klasse erben kann, mußt du innerhalb der Klasse Person eine
Objektvariable arbeitsvertrag von der jeweiligen Klasse ableiten, was man ja durch
ein Argument im Funktionsaufruf steuern kann.
Ausgabe der Objektvariablen:
object(c_person)#3 (10) {
["vorname:protected"]=>
NULL
["nachname:protected"]=>
NULL
["person_plz:protected"]=>
NULL
["person_ort:protected"]=>
NULL
["person_strasse:protected"]=>
NULL
["arbeitsvertrag:protected"]=>
object(c_teilzeit)#5 (3) {
["vertrag:protected"]=>
string(8) "teilzeit"
["gehalt:protected"]=>
int(400)
["urlaubstage:protected"]=>
int(8)
}
["standort:protected"]=>
string(6) "Bremen"
["standort_plz:protected"]=>
NULL
["standort_ort:protected"]=>
NULL
["standort_strasse:protected"]=>
NULL
}
object(c_person)#4 (10) {
["vorname:protected"]=>
NULL
["nachname:protected"]=>
NULL
["person_plz:protected"]=>
NULL
["person_ort:protected"]=>
NULL
["person_strasse:protected"]=>
NULL
["arbeitsvertrag:protected"]=>
object(c_vollzeit)#6 (5) {
["vertrag:protected"]=>
string(8) "vollzeit"
["urlaubsgeld:protected"]=>
int(1200)
["weihnachtsgeld:protected"]=>
NULL
["gehalt:protected"]=>
int(2890)
["urlaubstage:protected"]=>
int(32)
}
["standort:protected"]=>
string(7) "Viersen"
["standort_plz:protected"]=>
NULL
["standort_ort:protected"]=>
NULL
["standort_strasse:protected"]=>
NULL
}
Was man in den Ausgaben der Objektvariablen nicht sieht ist, dass auch Methoden vererbt werden.
Heißt in diesem Beispiel, dass es in der Klasse Teilzeit eine Methode namens get_gehalt gibt,
die aber auch aufgerufen kann, wenn eine Person einen Vollzeitvertrag hat.
Das ist natürlich nur ein kleines Beispiel, wie man es machen könnte.
Gruß
Günni
schon mal was von Vererbung gehört(gelesen)?
http://msdn.microsoft.com/de-de/library/ms228387(v=vs.80).aspx
von Arbeitsvertrag abgeleitet die Klasse:
Vollzeitarbeitsvertrag: (Arbeitszeit,Entgelt)
Teilzeitarbeitsvertrag (Arbeitszeit,Entgelt,kein Urlaubsgeld)
Vollzeitarbeitsvertrag: (Arbeitszeit,Entgelt)
Teilzeitarbeitsvertrag (Arbeitszeit,Entgelt,kein Urlaubsgeld)
Da der Vollzeitarbeitsvertrag Eigenschaften des Teilzeitarbeitsvertrags enthält,
könnte man auch eine Klasse Teilzeitarbeitsvertrag erstellen, und eine Klasse
Vollzeitarbeitsvertrag davon ableiten und um Eigenschaften erweitern, die in
Teilzeitarbeitsvertrag nicht enthalten sind, anstatt von einer Basisklasse zwei
Klassen abzuleiten.
Da dir Pseudocode ausreicht , mal ein Beispiel in PHP
<?php
class c_teilzeit{
protected $vertrag = 'teilzeit';
protected $gehalt;
protected $urlaubstage;
public function set_gehalt($gehalt){
$this->gehalt = $gehalt;
}
public function set_urlaubstage($urlaubstage){
$this->urlaubstage = $urlaubstage;
}
public function get_gehalt(){
return $this->gehalt;
}
};
class c_vollzeit extends c_teilzeit{
protected $vertrag = 'vollzeit';
protected $urlaubsgeld;
protected $weihnachtsgeld;
public function set_urlaubsgeld($urlaubsgeld){
$this->urlaubsgeld = $urlaubsgeld;
}
public function set_weihnachtsgeld($weihnachtsgeld){
$this->weihnachtsgeld = $weihnachtsgeld;
}
};
?>
Erzeugt man nun ein Objekt der Klasse c_teilzeit, enthält dieses die Eigenschaften
gehalt und urlaubstage. Die Klasse c_vollzeit erbt diese Eigenschaften,
und enthält außerdem urlaubsgeld und weihnachtsgeld.
Beispiel:
<?php
$teilzeitjob = new c_teilzeit;
$vollzeitjob = new c_vollzeit;
?>
Ausgabe der Objektvariablen:
object(c_teilzeit)#1 (3) {
["vertrag:protected"]=>
string(8) "teilzeit"
["gehalt:protected"]=>
NULL
["urlaubstage:protected"]=>
NULL
}
object(c_vollzeit)#2 (5) {
["vertrag:protected"]=>
string(8) "vollzeit"
["urlaubsgeld:protected"]=>
NULL
["weihnachtsgeld:protected"]=>
NULL
["gehalt:protected"]=>
NULL
["urlaubstage:protected"]=>
NULL
}
Es gibt viele Personen die an einem Standort die dort
einen Vollzeit-, oder nur Teilzeitverträge abschliessen können.
Diese Personen ist unter einer Adresse gemeldet sein.
einen Vollzeit-, oder nur Teilzeitverträge abschliessen können.
Diese Personen ist unter einer Adresse gemeldet sein.
Hier machst du das Gleiche. Eine Klasse Standort mit seinen Daten,
z.B. plz, ort, strasse etc. ist deine Basisklasse, die um Personendaten erweitert wird.
Da C# aber nur von einer Klasse erben kann, mußt du innerhalb der Klasse Person eine
Objektvariable arbeitsvertrag von der jeweiligen Klasse ableiten, was man ja durch
ein Argument im Funktionsaufruf steuern kann.
<?php
class c_standort{
protected $standort;
protected $standort_plz;
protected $standort_ort;
protected $standort_strasse;
};
class c_person extends c_standort{
protected $vorname;
protected $nachname;
protected $person_plz;
protected $person_ort;
protected $person_strasse;
protected $arbeitsvertrag;
public function set_vertrag($vertrag){
switch($vertrag){
case 'teilzeit':$this->arbeitsvertrag = new c_teilzeit;break;
case 'vollzeit':$this->arbeitsvertrag = new c_vollzeit;break;
}
}
public function set_gehalt($gehalt){
$this->arbeitsvertrag->set_gehalt($gehalt);
}
public function set_urlaubsgeld($urlaubsgeld){
$this->arbeitsvertrag->set_urlaubsgeld($urlaubsgeld);
}
public function set_urlaubstage($urlaubstage){
$this->arbeitsvertrag->set_urlaubstage($urlaubstage);
}
public function set_standort($standort){
$this->standort = $standort;
}
public function get_gehalt(){
return $this->arbeitsvertrag->gehalt;
}
};
/*
* Zwei Personen anlegen
*/
$p1 = new c_person;
$p2 = new c_person;
/*
* Arbeitsvertrag
*/
$p1->set_vertrag('teilzeit');
$p2->set_vertrag('vollzeit');
/*
* Standort
*/
$p1->set_standort('Bremen');
$p2->set_standort('Viersen');
/*
* Urlaubstage
*/
$p1->set_urlaubstage(8);
$p2->set_urlaubstage(32);
/*
* Urlaubsgeld
*/
$p2->set_urlaubsgeld(1200);
/*
* Gehalt
*/
$p1->set_gehalt(400);
$p2->set_gehalt(2890);
?>
Ausgabe der Objektvariablen:
object(c_person)#3 (10) {
["vorname:protected"]=>
NULL
["nachname:protected"]=>
NULL
["person_plz:protected"]=>
NULL
["person_ort:protected"]=>
NULL
["person_strasse:protected"]=>
NULL
["arbeitsvertrag:protected"]=>
object(c_teilzeit)#5 (3) {
["vertrag:protected"]=>
string(8) "teilzeit"
["gehalt:protected"]=>
int(400)
["urlaubstage:protected"]=>
int(8)
}
["standort:protected"]=>
string(6) "Bremen"
["standort_plz:protected"]=>
NULL
["standort_ort:protected"]=>
NULL
["standort_strasse:protected"]=>
NULL
}
object(c_person)#4 (10) {
["vorname:protected"]=>
NULL
["nachname:protected"]=>
NULL
["person_plz:protected"]=>
NULL
["person_ort:protected"]=>
NULL
["person_strasse:protected"]=>
NULL
["arbeitsvertrag:protected"]=>
object(c_vollzeit)#6 (5) {
["vertrag:protected"]=>
string(8) "vollzeit"
["urlaubsgeld:protected"]=>
int(1200)
["weihnachtsgeld:protected"]=>
NULL
["gehalt:protected"]=>
int(2890)
["urlaubstage:protected"]=>
int(32)
}
["standort:protected"]=>
string(7) "Viersen"
["standort_plz:protected"]=>
NULL
["standort_ort:protected"]=>
NULL
["standort_strasse:protected"]=>
NULL
}
Was man in den Ausgaben der Objektvariablen nicht sieht ist, dass auch Methoden vererbt werden.
Heißt in diesem Beispiel, dass es in der Klasse Teilzeit eine Methode namens get_gehalt gibt,
die aber auch aufgerufen kann, wenn eine Person einen Vollzeitvertrag hat.
<?php
echo $p1->get_gehalt(); // Gibt 400 aus: Gehalt Person1
echo $p2->get_gehalt(); // Gibt 2890 aus: Gehalt Person2
?>
Das ist natürlich nur ein kleines Beispiel, wie man es machen könnte.
Gruß
Günni
Hi StefanLausL,
Das Schlüsselwort extends bedeutet nicht Ableitung, sondern dass eine neue Klasse die Eigenschaften (Variablen) und
Methoden (Funktionen) einer hinter extends angegebenen Klasse erbt.
class klasse2 extends klasse1 ist also gleichbedeutend mit public class klasse2 : klasse1.
Somit wäre public class teilzeitvertrag : arbeitsvertrag falsch, da hier eine Teilzeitkraft z.B. Urlaubsgeld bekommen
würde, was aber nicht sein sollte, laut deiner Fragestellung. Es muß heißen public class arbeitsvertrag : teilzeitvertrag.
Im Teilzeitvertrag gibt es Gehalt und Urlaub, das erbt der arbeitsvertrag vom teilzeitvertrag, zusätzlich enthält der arbeitsvertrag
noch Urlaubsgeld, Weihnachtsgeld, Prämie etc.. Vielleicht noch ein "kleines" Beispiel:
Da das Klassenprinzip helfen soll, wiederverwendbaren Code zu nutzen, könntest du z.B. auch verschiedene Standortklassen anlegen
und deren Eigenschaften vorbelegen, z.B. Filiale, Adresse, Telefon, Fax etc.. Zieht ein Mitarbeiter um oder wird versetzt, brauchst du
seiner Variablen standort nur ein Objekt des neuen Standorts zuzuweisen, anstatt alle Daten "händisch" zu ändern.
Hoffe, ich hab' dir ein bißchen weiter geholfen.
Gruß
Günni
Von Vererbung habe ich zwar schon gelesen, leider ist mir aber der Unterschied zur Ableitung nicht ganz klar.
Wann muss ich eine Klasse von der anderen Klasse ableiten (extends) und wann vererben (Subklasse : Superklasse) ?
Oder gibt es da überhaupt einen Unterschied.
In C# erreiche ich mit Teilzeitvertrag : Arbeitsvertrag eine Spezialisierung der Klasse Arbeitsvertrag.
Zumindest dachte ich das.
Wann muss ich eine Klasse von der anderen Klasse ableiten (extends) und wann vererben (Subklasse : Superklasse) ?
Oder gibt es da überhaupt einen Unterschied.
In C# erreiche ich mit Teilzeitvertrag : Arbeitsvertrag eine Spezialisierung der Klasse Arbeitsvertrag.
Zumindest dachte ich das.
Das Schlüsselwort extends bedeutet nicht Ableitung, sondern dass eine neue Klasse die Eigenschaften (Variablen) und
Methoden (Funktionen) einer hinter extends angegebenen Klasse erbt.
class klasse2 extends klasse1 ist also gleichbedeutend mit public class klasse2 : klasse1.
Somit wäre public class teilzeitvertrag : arbeitsvertrag falsch, da hier eine Teilzeitkraft z.B. Urlaubsgeld bekommen
würde, was aber nicht sein sollte, laut deiner Fragestellung. Es muß heißen public class arbeitsvertrag : teilzeitvertrag.
Im Teilzeitvertrag gibt es Gehalt und Urlaub, das erbt der arbeitsvertrag vom teilzeitvertrag, zusätzlich enthält der arbeitsvertrag
noch Urlaubsgeld, Weihnachtsgeld, Prämie etc.. Vielleicht noch ein "kleines" Beispiel:
Da das Klassenprinzip helfen soll, wiederverwendbaren Code zu nutzen, könntest du z.B. auch verschiedene Standortklassen anlegen
und deren Eigenschaften vorbelegen, z.B. Filiale, Adresse, Telefon, Fax etc.. Zieht ein Mitarbeiter um oder wird versetzt, brauchst du
seiner Variablen standort nur ein Objekt des neuen Standorts zuzuweisen, anstatt alle Daten "händisch" zu ändern.
<?php
class c_standort_Bremen{
protected $filiale='Netto Bremen';
protected $standort_plz='28195';
protected $standort_ort='Bremen';
protected $standort_strasse='Hamburgerstrasse 120';
public function zeige_standort(){
return $this->filiale;
}
};
class c_standort_Viersen{
protected $filiale='Netto Viersen';
protected $standort_plz='41748';
protected $standort_ort='Viersen';
protected $standort_strasse='Hauptstrasse 134';
public function zeige_standort(){
return $this->filiale;
}
};
class c_person{
protected $vorname;
protected $nachname;
protected $standort;
/*
* Hier wird der Standort der Person gesetzt
*/
public function setze_standort($standort){
switch($standort){
case 'Bremen': $this->standort = new c_standort_Bremen;break;
case 'Viersen': $this->standort = new c_standort_Viersen;break;
}
}
/*
* Hier wird ein neuer Standort gesetzt.
* Zuerst wird der alte Standort gelöscht, und mittels Aufruf der Funktion
* setze_standort(string 'neuer Standort') ein neuer Standort festgelegt
*/
public function aendere_standort($standort){
$this->standort = NULL;
$this->setze_standort($standort);
}
/*
* Standort zeigen. Zumindest in PHP muß hier eine klasseneigene (die der Klasse standort) Funktion
* aufgerufen werden, da ich auf die Variable **filiale** in der Klasse standort so keinen Zugriff habe.
* Ob das in C# nötig ist, weiß ich nicht.
*/
public function zeige_standort(){
echo $this->standort->zeige_standort();
}
};
/*
* Person anlegen und Standort setzen
*/
$mueller = new c_person;
$mueller->setze_standort('Bremen');
echo '<pre>';
$mueller->zeige_standort(); // Ausgabe: Netto Bremen
echo '</pre>';
/*
* Standort der Person ändern
*/
$mueller->aendere_standort('Viersen');
echo '<pre>';
$mueller->zeige_standort(); // Ausgabe: Netto Viersen
echo '</pre>';
?>
Hoffe, ich hab' dir ein bißchen weiter geholfen.
Gruß
Günni