Forum: PC-Programmierung C# - Wie kann ich beim Aufrufen einer Funktion einen Konstruktor auswählen ?


von Marco K. (mbc)


Lesenswert?

Hi Leute

Mal wieder ein kleines Problem bei dem ich mich als Anfänger total 
überfordert sehe.

Ich habe hier eine Funktion die mir einige Dinge erledigen soll.

Dem zu Grunde liegen verschiedene Objekte, hier im Besispiel einmal zwei 
Objekte, einmal eine Audiodatei und einmal eine Grafikdatei.

Für die Audiodatei brauche ich folgende infos als enum:
-Bitrate
-Zielformat

Für die Grafik brauche ich folgende infos als gemischt:
-Größe x (als int)
-Größe y (als int)
-Zielformat (als enum)

Meine Funktion soll z.B. so aussehen
1
 public void wandle (QUELLE.audiodatei, enum.Bitrate, enum.Zielformat)

für die Grafik soll das dann so aussehen:
1
 public void wandle (QUELLE.grafik, int Größe_x, int Größe_y, enum.Zielformat)

Also bestimmend durch das enum QUELLE muß jeweils ein anderer 
Konstruktor verwendet werden, welcher dann aus weiteren enums oder ints 
oder strings besteht.

Könnte mir jemand mal bitte mit einem Codebeispiel weiterhelfen und ganz 
kurz erläutern um was ews sich dann dabei handelt?
Mit Konstruktoren kann man so viel machen ...

Wenn möglich bitte so "einfach wie möglich", auch wenn es dann nicht die 
100% beste Lösung ist. Ich möchte wenigstens einigermaßen verstehen was 
da passiert, das ist manchmal dann sehr schwierig wenn man den 100% 
besten Weg geht ...

MFG
Marco

von Severino R. (severino)


Lesenswert?

Mir ist nicht klar, was Du meinst.

Wenn Du meinst, dass Du dieselbe Funktion (d.h. gleichnamige) mit 
unterschiedlichen Parametern aufrufen kannst und dann je nachdem ein 
anderer Funktionsrumpf aufgerufen wird, dann meinst Du "Funktionen 
überladen".

D.h. Du definierst einmal die Funktion
1
public void wandle (QUELLE.audiodatei, enum.Bitrate, enum.Zielformat)
2
{
3
  // mach irgendwas  mit der Audiodatei
4
}
und
1
public void wandle (QUELLE.grafik, int Größe_x, int Größe_y, enum.Zielformat)
2
{
3
  // mach irgendwas  mit der Grafik
4
}

Der Compiler sorgt dann dafür, dass beim Aufruf mit den Parametern
(QUELLE, Bitrate, Zielformat) die erste wandle() aufgerufen wird und bei
(QUELLE, int, int, Zielformat) die zweite wandle().

Dies geschieht aber nicht (zur Laufzeit) aufgrund des Wertes von QUELLE, 
sondern zur Compilierzeit aufgrund der Parameterliste.
Mit Konstruktoren hat dies nichts zu tun.

von Marco K. (mbc)


Lesenswert?

Tut mir leid das ich mich nicht deutlicher Ausdrücken kann ...

Also im Grunde hätte ich gerne eine Funktion die lediglich "wandle" 
heißt.

Was diese Funktion jedoch umwandeln soll entscheidet sich erst während 
der Laufzeit.

Jenachdem was sich da dann ergibt ist es halt eine Audiodatei oder eine 
grafikdatei. Beide DInge brauchen aber halt andere Parameter die zum 
umwandeln (durch die funktion "wandle") benötigt wird.

Man könnte auch einfacher sagen:
Ich möchte durch die funktion "wandle" quasi eine Art String erzeugen 
wie man das quasi bei einem cli-Programm benötigt, halt nur mit 
Parametern die abhängig von dem zu wandelnden Objekt sind und 
dementsprechend teilweise (durch meine gewünschten enums) feste 
auswählbare Werte haben.
Zudem ist mir wichtig, das ich nicht vergesse einenc der benötigten 
Parameter anzugeben.

Da es nachher viele Quellen zum "wandeln" gibt hätte ich das gerne 
"Idiotensicher", ich weis ja schließlich wer hier vorm Bildschirm sitzt 
;-))

Ich könnte natürlich auch sowas hier machen:
1
 public void wandle_audiodatei (enum.Bitrate, enum.Zielformat)
2
{tu was mit audio}
und dann:
1
 public void wandle_grafik (int Größe_x, int Größe_y, enum.Zielformat)
2
{tu was mit grafik}

Mir geht es darum zu versuchen das "wandle_audiodatei" und 
"wandle_grafik" durch "wandle (QUELLE.AUSWAHL), ..." zu ersetzen (sofern 
das möglich ist).

Hoffe ich konnte es jetzt besser "erklären".

MFG
Marco

von Severino R. (severino)


Lesenswert?

Marco K. wrote:

> Also im Grunde hätte ich gerne eine Funktion die lediglich "wandle"
> heißt.
OK, verstanden.

> Was diese Funktion jedoch umwandeln soll entscheidet sich erst während
> der Laufzeit.
Bist Du sicher?

> Jenachdem was sich da dann ergibt ist es halt eine Audiodatei oder eine
> grafikdatei. Beide DInge brauchen aber halt andere Parameter die zum
> umwandeln (durch die funktion "wandle") benötigt wird.
OK.

> Man könnte auch einfacher sagen:
> Ich möchte durch die funktion "wandle" quasi eine Art String erzeugen
> wie man das quasi bei einem cli-Programm benötigt, halt nur mit
> Parametern die abhängig von dem zu wandelnden Objekt sind und
> dementsprechend teilweise (durch meine gewünschten enums) feste
> auswählbare Werte haben.
> Zudem ist mir wichtig, das ich nicht vergesse einenc der benötigten
> Parameter anzugeben.
Kannst Du quasi ein Beispiel für die Audiodatei und für die Grafik 
machen?

> Ich könnte natürlich auch sowas hier machen:
>
>
1
 public void wandle_audiodatei (enum.Bitrate, enum.Zielformat)
2
> {tu was mit audio}
> und dann:
>
1
 public void wandle_grafik (int Größe_x, int Größe_y,
2
> enum.Zielformat)
3
> {tu was mit grafik}
>
> Mir geht es darum zu versuchen das "wandle_audiodatei" und
> "wandle_grafik" durch "wandle (QUELLE.AUSWAHL), ..." zu ersetzen (sofern
> das möglich ist).
Ist möglich, warum nicht? Sofern das, was bei ", ..." steht sich 
unterscheidet, merkt der Compiler, welche wandle() gemeint ist (zur 
Compilierzeit).

Ich habe noch nicht verstanden, weshalb Du die Auswahl der Funktion 
wandle() erst zur Laufzeit willst.
Du musst ja ohnehin bereits zur Compilierzeit festlegen, um was es sich 
handelt (Audiodatei/Grafik), weil Du ja für die Grafik keine Bitrate und 
für die Audiodatei keine Koordinaten angeben wirst, oder?

von Marco K. (mbc)


Lesenswert?

>>Du musst ja ohnehin bereits zur Compilierzeit festlegen, um was es sich
>>handelt (Audiodatei/Grafik), weil Du ja für die Grafik keine Bitrate und
>>für die Audiodatei keine Koordinaten angeben wirst, oder?

Genau da liegt mein Problem:

Der Benutzer des Programmes entscheidet erst zur Laufzeit was er gerne 
wandeln möchte ... das weis ich jetzt halt noch nicht, das geschieht 
halt erst dynamisch zur Laufzeit.

Und es ist auch richtig, das ich bei einer Grafik nichts mit der Bitrate 
anfangen kann, deshalb möchte ich das ja gerne irgendwie "kapseln".
Die Werte für diese Parameter kommen nachher aus der GUI, wobei ich 
gerade überlege ob ich nicht auch einfach meine selbsterstellte 
Schaltfläche (welche diese Parameter alle enthält) an meine Funktion 
"wandle" übergeben sollte ... das müßte doch auch gehen.

Bei der audiowandlung kommt es nachher z.B. noch darauf an, um was es 
sich da genau handelt (wav, mp3, flac, ...).

Deshalb heißt es nachher dann auch QUELLE.wav, QUELLE.mp3, QUELLE.flac 
... nur für jede Art von Quelle brauche ich andere Parameter die 
zwingend notwendig sind.

Die Quellen (wav, flac, mp3) sollen wenn möglich als Auswahl bereit 
stehen, damit ich nur einen Anlaufpunkt habe wenn später mal ein neues 
Format (mit wiederrum neuen Parametern) hinzukommt. Deshalb mein "Enum".
Zumal gibt es bei den Parametern bestimmte Grenzen (z.B. int minimum = 
32, int maximum = 128 ...), da würde ich gerne durch Auswahl (Enum) 
verwindern dsa ich da Zahlen programmiere die nicht möglich sind. Auch 
hier wiederrung nur eine einzige Anlaufstelle wenn ich die Werte mal 
weiter einschränken oder erweitern sollte.

Mir geht es hier natürlich nur in etwa ums Prinzip, wenn es z.B. statt 
der enums auch anders geht ist mir das auch recht ... ich wüßte es 
erstmal nicht anders umzusetzen. Deshalb meine Frage an Profis ...

Deshalb meine Frage ob mans noch etwas schöner hinkriegt, als meine 
(wohl funktionierende) Lösung es handhaben würde.

Wie gesagt, ich bin totaler Anfänger, ist halt nicht so einfach wenn man 
nicht genau weiß wie man es lösen kann, wobei es viele Wege gibt.

MFG
Marco

von Severino R. (severino)


Lesenswert?

Marco K. wrote:

> Der Benutzer des Programmes entscheidet erst zur Laufzeit was er gerne
> wandeln möchte ... das weis ich jetzt halt noch nicht, das geschieht
> halt erst dynamisch zur Laufzeit.
Ja, aber Du musst doch bereits zur Compilierzeit pro Dateityp festlegen, 
was mit den Parametern geschehen soll.
Also immer dann, wenn es sich z.B. um eine MP3 Datei handelt, sollen die 
Parameter soundso übergeben werden und die haben dieunddie 
Wertebereiche.

Schliesslich wirst Du ja Programmcode schreiben für die Wandlung, und 
der ist je nach Dateityp anders, oder?

Vielleicht machst Du mal ein konkretes Beispiel mit Audio und Grafik 
inkl. dessen, was in wandle() geschieht.

von Marco K. (mbc)


Lesenswert?

"kein Problem" werd ich aber heute nicht mehr schaffen, zumal ich noch 
nicht mal genau weis, wie ich innerhalb dieser Funktion überhaupt 
weitergehen möchte ... es fehlt halt die "Routine" :-)

Vielen Dank schonmal bis hierhin!

MFG
Marco

von daniel (Gast)


Lesenswert?

es klingt als würde dein inneres nach einer polymorphie streben.

mach Source als Oberklasse für Image,Audio,...
mach irgendwo abstrakte(virtuelle) Funktion convert(Source)
und implementiere es je nach Source.

das ganze herumwirbeln mit enums errinnert mich an switch
nachbildung einer polymorphie.

--
daniel

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Marco K. wrote:

>
1
 public void wandle (QUELLE.grafik, int Größe_x, int Größe_y,
2
> enum.Zielformat)

Auuuuua... das tut ja echt weh.

von Der M. (steinadler)


Lesenswert?

Michael G. wrote:
>>
1
 public void wandle (QUELLE.grafik, int Größe_x, int Größe_y,
2
>> enum.Zielformat)
>
> Auuuuua... das tut ja echt weh.

Na in .NET funktioniert das schon (sogar ohne Compilerfehler). Ob sowas 
gut ist, ist eine andere Frage.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.