stefanlausl
Goto Top

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 !!

Content-ID: 190563

Url: https://administrator.de/contentid/190563

Ausgedruckt am: 16.11.2024 um 11:11 Uhr

catachan
catachan 01.09.2012 um 12:50:27 Uhr
Goto Top
Hi

bin zwar kein .net Programmierer, aber von der Logik her wäre das so:
du erzeugst einfach eine neues Objekt vom Typ Vollzeitarbeitsvertrag oder Teilzeitarbeitsvertrag und lässt die Eigenschaft der Person Arbeitsvertrag drauf zeigen

LG
StefanLausL
StefanLausL 02.09.2012 um 09:00:55 Uhr
Goto Top
Vielen Dank für die Antwort

So in der Theorie hätte ich mir das auch so gedacht.
Leider habe ich keine Idee wie das mit C# Code gemacht wird.

Der Aufruf für die Funktion könnte so aussehen:

Teilzeitvertrag.NewVertragStandort1(person,arbeitszeit,entgeld)

Aber wie würde so eine Funktion aussehen ?
Guenni
Guenni 07.09.2012 um 00:59:24 Uhr
Goto Top
Hi StefanLausL,

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)

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 face-smile , 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.

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
StefanLausL
StefanLausL 07.09.2012 aktualisiert um 07:42:18 Uhr
Goto Top
Vielen Dank für Deine ausführliche Anwort und dem Beispielcode.
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.
Guenni
Guenni 12.09.2012 um 23:54:22 Uhr
Goto Top
Hi StefanLausL,

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.

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
StefanLausL
StefanLausL 13.09.2012 um 07:58:13 Uhr
Goto Top
Ja sehr gut.
Das hilft mir schon sehr weiter.

Nur eines noch:

Müsste nicht trotzdem die Klasse Teilzeitvertag vom Arbeitsvertrag abgeleitet werden ?

Die Klasse Arbeitsvertrag hat alle Eigenschnaften und Methoden für Arbeitsverträge Gesamt,
also Urlaub, Gehalt usw...

Und in der Klasse Teilzeitvertrag sind dann spezielle Methoden wie z.B. Laufzeit, Wochenarbeitszeit usw..
In der Klasse Vollzeitarbeitsvertrag könnte dann Urlaubsgeld usw. geregelet sein.

Also Arbeitsvertrag ist eine Art Generalisierung für die verschiedenen Vertragsarten