Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Objektorientiertes Programmierung C Sharp

Frage Entwicklung Visual Studio

Mitglied: StefanLausL

StefanLausL (Level 1) - Jetzt verbinden

01.09.2012 um 12:14 Uhr, 3262 Aufrufe, 6 Kommentare






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




Mitglied: catachan
01.09.2012 um 12:50 Uhr
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
Bitte warten ..
Mitglied: StefanLausL
02.09.2012 um 09:00 Uhr
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 ?
Bitte warten ..
Mitglied: Guenni
07.09.2012 um 00:59 Uhr
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 , mal ein Beispiel in PHP

01.
<?php 
02.
class c_teilzeit{ 
03.
	protected $vertrag = 'teilzeit'
04.
	protected $gehalt
05.
	protected $urlaubstage
06.
	public function set_gehalt($gehalt){ 
07.
		$this->gehalt = $gehalt
08.
09.
	public function set_urlaubstage($urlaubstage){ 
10.
		$this->urlaubstage = $urlaubstage
11.
12.
	public function get_gehalt(){ 
13.
		return $this->gehalt; 
14.
15.
}; 
16.
 
17.
class c_vollzeit extends c_teilzeit{ 
18.
	protected $vertrag = 'vollzeit'
19.
	protected $urlaubsgeld
20.
	protected $weihnachtsgeld
21.
	public function set_urlaubsgeld($urlaubsgeld){ 
22.
		$this->urlaubsgeld = $urlaubsgeld
23.
24.
	public function set_weihnachtsgeld($weihnachtsgeld){ 
25.
		$this->weihnachtsgeld = $weihnachtsgeld
26.
27.
}; 
28.
?>
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:

01.
<?php 
02.
$teilzeitjob = new c_teilzeit; 
03.
$vollzeitjob = new c_vollzeit; 
04.
?>
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.

01.
<?php 
02.
class c_standort{ 
03.
	protected $standort
04.
	protected $standort_plz
05.
	protected $standort_ort
06.
	protected $standort_strasse
07.
}; 
08.
 
09.
class c_person extends c_standort{ 
10.
	protected $vorname
11.
	protected $nachname
12.
	protected $person_plz
13.
	protected $person_ort
14.
	protected $person_strasse
15.
	protected $arbeitsvertrag
16.
	public function set_vertrag($vertrag){ 
17.
		switch($vertrag){ 
18.
			case 'teilzeit':$this->arbeitsvertrag = new c_teilzeit;break
19.
			case 'vollzeit':$this->arbeitsvertrag = new c_vollzeit;break
20.
21.
22.
	public function set_gehalt($gehalt){ 
23.
		$this->arbeitsvertrag->set_gehalt($gehalt); 
24.
25.
	public function set_urlaubsgeld($urlaubsgeld){ 
26.
		$this->arbeitsvertrag->set_urlaubsgeld($urlaubsgeld); 
27.
28.
	public function set_urlaubstage($urlaubstage){ 
29.
		$this->arbeitsvertrag->set_urlaubstage($urlaubstage); 
30.
31.
	public function set_standort($standort){ 
32.
		$this->standort = $standort
33.
34.
	public function get_gehalt(){ 
35.
		return $this->arbeitsvertrag->gehalt; 
36.
37.
}; 
38.
 
39.
/* 
40.
* Zwei Personen anlegen 
41.
*/ 
42.
$p1 = new c_person; 
43.
$p2 = new c_person; 
44.
 
45.
/* 
46.
* Arbeitsvertrag 
47.
*/ 
48.
$p1->set_vertrag('teilzeit'); 
49.
$p2->set_vertrag('vollzeit'); 
50.
/* 
51.
* Standort 
52.
*/ 
53.
$p1->set_standort('Bremen'); 
54.
$p2->set_standort('Viersen'); 
55.
/* 
56.
* Urlaubstage 
57.
*/ 
58.
$p1->set_urlaubstage(8); 
59.
$p2->set_urlaubstage(32); 
60.
/* 
61.
* Urlaubsgeld 
62.
*/ 
63.
$p2->set_urlaubsgeld(1200); 
64.
/* 
65.
* Gehalt 
66.
*/ 
67.
$p1->set_gehalt(400); 
68.
$p2->set_gehalt(2890); 
69.
?>
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.


01.
<?php 
02.
echo $p1->get_gehalt(); // Gibt 400 aus: Gehalt Person1 
03.
echo $p2->get_gehalt(); // Gibt 2890 aus: Gehalt Person2 
04.
?>
Das ist natürlich nur ein kleines Beispiel, wie man es machen könnte.

Gruß
Günni
Bitte warten ..
Mitglied: StefanLausL
07.09.2012, aktualisiert um 07:42 Uhr
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.
Bitte warten ..
Mitglied: Guenni
12.09.2012 um 23:54 Uhr
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.

01.
<?php 
02.
class c_standort_Bremen{ 
03.
	protected $filiale='Netto Bremen'; 
04.
	protected $standort_plz='28195'; 
05.
	protected $standort_ort='Bremen'; 
06.
	protected $standort_strasse='Hamburgerstrasse 120'; 
07.
	public function zeige_standort(){ 
08.
		return $this->filiale; 
09.
10.
}; 
11.
class c_standort_Viersen{ 
12.
	protected $filiale='Netto Viersen'; 
13.
	protected $standort_plz='41748'; 
14.
	protected $standort_ort='Viersen'; 
15.
	protected $standort_strasse='Hauptstrasse 134'; 
16.
	public function zeige_standort(){ 
17.
		return $this->filiale; 
18.
19.
}; 
20.
class c_person{ 
21.
	protected $vorname; 
22.
	protected $nachname; 
23.
	protected $standort; 
24.
	/* 
25.
	* Hier wird der Standort der Person gesetzt 
26.
	*/ 
27.
	public function setze_standort($standort){ 
28.
		switch($standort){ 
29.
			case 'Bremen': $this->standort = new c_standort_Bremen;break; 
30.
			case 'Viersen': $this->standort = new c_standort_Viersen;break; 
31.
32.
33.
	/* 
34.
	* Hier wird ein neuer Standort gesetzt. 
35.
	* Zuerst wird der alte Standort gelöscht, und mittels Aufruf der Funktion 
36.
	* setze_standort(string 'neuer Standort') ein neuer Standort festgelegt 
37.
	*/ 
38.
	public function aendere_standort($standort){ 
39.
		$this->standort = NULL; 
40.
		$this->setze_standort($standort); 
41.
42.
	/* 
43.
	* Standort zeigen. Zumindest in PHP muß hier eine klasseneigene (die der Klasse standort) Funktion 
44.
	* aufgerufen werden, da ich auf die Variable **filiale** in der Klasse standort so keinen Zugriff habe. 
45.
	* Ob das in C# nötig ist, weiß ich nicht. 
46.
	*/ 
47.
	public function zeige_standort(){ 
48.
		echo $this->standort->zeige_standort(); 
49.
50.
}; 
51.
/* 
52.
* Person anlegen und Standort setzen 
53.
*/ 
54.
$mueller = new c_person; 
55.
$mueller->setze_standort('Bremen'); 
56.
echo '<pre>'; 
57.
$mueller->zeige_standort(); // Ausgabe: Netto Bremen 
58.
echo '</pre>'; 
59.
/* 
60.
* Standort der Person ändern 
61.
*/ 
62.
$mueller->aendere_standort('Viersen'); 
63.
echo '<pre>'; 
64.
$mueller->zeige_standort();  // Ausgabe: Netto Viersen 
65.
echo '</pre>'; 
66.
?>
Hoffe, ich hab' dir ein bißchen weiter geholfen.


Gruß
Günni
Bitte warten ..
Mitglied: StefanLausL
13.09.2012 um 07:58 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Visual Studio
C-Sharp WPF Binding TextBox.Text und Property MVVM (die 2.) (4)

Frage von mayho33 zum Thema Visual Studio ...

Windows Server
C sharp oder Powershell oder VB? (3)

Frage von 1410640014 zum Thema Windows Server ...

Visual Studio
Interner Shop mit Microsoft Forms Anwendung C-Sharp (2)

Frage von talaihan zum Thema Visual Studio ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...