Top-Themen

Aktuelle Themen (A bis Z)

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, 3335 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 ..
Ähnliche Inhalte
C und C++
C-Sharp - Grundlagen zur Programmierung wartbarer Software
gelöst Frage von mabue88C und C++5 Kommentare

Hallo, ich soll eine Software in C# schreiben. Grundsätzlich kein Problem. In einer Besprechung fielen Begriffe wie Business Model ...

IDE & Editoren
IDE für C-Sharp und C++ auf Windows
gelöst Frage von BugdroidIDE & Editoren8 Kommentare

Hallo, Ich nutze derzeit Visual Studio, aber auf Dauer ist es mir etwas zu Ressourcenfressend und für meine Zwecke ...

C und C++
C Sharp XAML Universal
Frage von DippsC und C++3 Kommentare

Hallo ich versuche gerade mit C#2015 ein Projekt Universal XAML zu erstellen um auf einem Raberry PI 2 mit ...

C und C++
C-sharp SearchPattern (Regex)
Frage von YanmaiC und C++6 Kommentare

Hallo ihr Administratoren, ich verwende ein AUtocpmpletemenu Plugin. Dort habe ich Snippets, die dann sozusagen completed werden. Beim erstellen ...

Neue Wissensbeiträge
Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 4 StundenInternet3 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registierunf von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Verschlüsselung & Zertifikate

19 Jahre alter Angriff auf TLS funktioniert immer noch

Information von BassFishFox vor 11 StundenVerschlüsselung & Zertifikate1 Kommentar

Interessant zu lesen. Der Bleichenbacher-Angriff gilt unter Kryptographen als Klassiker, trotzdem funktioniert er oft noch. Wie wir herausgefunden haben, ...

Windows 10

Windows 10 Fall Creators Update - Neue Funktion Hyper-V Standardswitch kann ggf. Fehler bei Proxy Configs verursachen

Erfahrungsbericht von rzlbrnft vor 22 StundenWindows 103 Kommentare

Hallo Kollegen, Da wir die Gefahr lieben, haben wir bei einigen Usern nun mittlerweile das Creators Update drauf. Einige ...

Sicherheit

TLS-Zertifikat und privater Schlüssel von Microsofts Dynamics 365 geleakt

Information von Penny.Cilin vor 1 TagSicherheit

Microsoft hat versehentlich das TLS-Zertifikat inklusive dem privaten Schlüssel seiner Business-Anwendung Dynamics 365 geleakt. TLS-Zertifikat und privater Schlüssel von ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

Netzwerkmanagement
NAS über zwei weitere Ethernet Anschlüsse verbinden
gelöst Frage von Sibelius001Netzwerkmanagement16 Kommentare

Sorry - ich bin hier wahrscheinlich als kompetter IT Trottel unterwegs. Aber eventuell kann mir jemand ganz einfach helfen: ...

LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless16 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...