mikrocontroller.net

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


Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht 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
 public void wandle (QUELLE.audiodatei, enum.Bitrate, enum.Zielformat)

für die Grafik soll das dann so aussehen:
 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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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
public void wandle (QUELLE.audiodatei, enum.Bitrate, enum.Zielformat)
{
  // mach irgendwas  mit der Audiodatei
}
und
public void wandle (QUELLE.grafik, int Größe_x, int Größe_y, enum.Zielformat)
{
  // mach irgendwas  mit der Grafik
}

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.

Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht 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:
 public void wandle_audiodatei (enum.Bitrate, enum.Zielformat)
{tu was mit audio}
und dann:
 public void wandle_grafik (int Größe_x, int Größe_y, enum.Zielformat)
{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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>
 public void wandle_audiodatei (enum.Bitrate, enum.Zielformat)
> {tu was mit audio}
> und dann:
>
 public void wandle_grafik (int Größe_x, int Größe_y,
> enum.Zielformat)
> {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?

Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco K. wrote:

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

Auuuuua... das tut ja echt weh.

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:
>>
 public void wandle (QUELLE.grafik, int Größe_x, int Größe_y,
>> 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.