Zwei Methoden mit gleichem Namen und Code aber unterschiedlichen Parametern
-
Hallo!
Ich habe zwei Methoden mit exakt dem selben Namen und auch Code aber mit unterschiedlichen Parametern.
private void ChangeSelectionSet(List<Device> devList) ... private void ChangeSelectionSet(List<MyDevice> devList) ...
Muss ich dann den Code auch zwei mal hinschreiben, was ja dank Strg+C/Strg+V kein Problem ist, aber macht man das auch wirklich so? Sieht ja nicht unbedingt professionell aus
Gibt es vielleicht sowas wie das base() beim überschreiben von Methoden?Lg THE_ONE
-
Mit den Grundlagen schon durch ?
Erbt MyDevice von Device ?
-
Damit ist man eigentlich nie wirklich durch, da man immer wieder was übersieht.
Zu deiner zweiten Frage ja: sie erben voneinander!
public abstract class Device : ICloneable .... public abstract class MyDevice : Device
Ps.: Mein Wissen über Methoden deckt sich ziemlich mit dem hier:
http://ag-kastens.uni-paderborn.de/lehre/material/csharp/Methoden.pdf
-
Wie füllst Du List<MyDevice> ? Reicht an der Stelle eventuell eine List<Device> ?
-
D.h. das Problem bin ich und mein schlechter Code.
Für das Problem das ich habe gibt es also keine Lösung so wie ich mir das vorgestellt habe, korrekt?Also ich habe 5 MyDevice Listen und 2 Device Listen.
Knuddlbaer schrieb:
Wie füllst Du List<MyDevice> ? Reicht an der Stelle eventuell eine List<Device> ?
Nein aber umgekehrt. Ich könnte an der Stelle wo ich den List<Device> Aufruf habe einen List<MyDevice> Aufruf ausführen, da ich weiß dass nur MyDevice Objkte in der aktuellen Device List sein können.
Das Problem ist nur das die zu übergebende Liste schon fertig vor mir liegen würde, nur dass sie halt nicht eine Listy<MyDevice> ist sondern eine List<Device>, und soweit ich weiß kann ich ja nicht einfach von List<Device> auf eine List<MyDevice> casten.Also das geht ja mal ned:
ChangeSelectionSet(DeviceListInstance as List<MyDevice>)
was ich aber machen könnte:
eine temporäre Liste erstellen und diese dann mit den Elementen der DeviceListInstance füllen, also so:list<MyDevice> tempList = new List<MyDevice>(DeviceListInstance.Count); foreach(Device d in DeviceListInstance ) { tempList.Add(d as MyDevice) } ChangeSelectionSet(tempList);
da ich aber versuche auf Performance zu achten, versuche ich jede for-Schleife zu vermeiden.
Spürt man so eine Schleife in Performance?
-
Ob der Code schlecht ist weiß man nicht zudem man ja nach "muss fertig und verkauft werden" und "kann nach besten Lehrbuch geschrieben werden" verstehen kann.
Möglichkeiten gibt es sicher. Mir schwebt da was mit Collections oder Enumeratoren vor - muß dafür aber selbst ins Buch schauen. (theta ?). Allerdings ist das auch mehr murks als code.
Das Problem ist, dass List<A> und List<B> zwei verschiedene Typen sind die keine Beziehung haben (eventuell noch IEnumerable (die nicht generische Version).
Nein aber umgekehrt. Ich könnte an der Stelle wo ich den List<Device> Aufruf habe einen List<MyDevice> Aufruf ausführen, da ich weiß dass nur MyDevice Objkte in der aktuellen Device List sein können.
Da ist aber irgendwo ein Denkfehler drinn. Du hattest geschrieben, dass der Code identisch ist, nur die Signatur anders ist. Warum brauchst Du dann die void Foo(List<MyDevice> bar) Funktion überhaupt ?
Erläutere mal warum Du die zweite Methode benötigst. Vllt. kann man das "Problem" umgehen und muss nicht nach einer eleganten Lösung um die verschiedenen Typen suchen.
-
da ich aber versuche auf Performance zu achten, versuche ich jede for-Schleife zu vermeiden.
Spürt man so eine Schleife in Performance?Das lässt sich so einfach nicht sagen.
Wenn "ChangeSelectionSet" nahezu nichts tut, und die Listen auch mal lange werden können, dann kann schon sein dass du es deutlich spürst.Sobald "ChangeSelectionSet" einiges an Arbeit verrichtet, wird der Overhead des Listen-Kopierens vermutlich total untergehen.
-> ausprobieren
BTW: mit C# 4.0 sollte das dann glaube ich endlich erledigt sein. Stichwort Covariance von Generics und so. Hilft dir aber vermutlich *jetzt* nicht viel
-
THE_ONE schrieb:
da ich aber versuche auf Performance zu achten, versuche ich jede for-Schleife zu vermeiden.
Spürt man so eine Schleife in Performance?1. Schlag mal den Begriff "Premature Optimizing" nach und verinnerlich dessen Bedeutung.
2. Nachdem Du verstanden hast was premature Optimizing bedeutet, präge Dir folgende Grundregel dazu ein: DONT DO IT.
3. So, nachdem Du dann (hoffentlich) begriffen hast was ich damit sagen wollte, kümmer Dich erst einmal um die FUNKTION deines Codes und scheiss auf Performance. Solange Du die Grundlagen der Programmierung nicht verstehst ist es absolut sinnlos über highlevel-Themen wie OPtimierung, Performance und Eleganz anchzudenken.
4. Als Zusatzthema denk mal über folgende Regel und deren Bedeutung nach: "First make it run, than make it fast".
-
Hallo THE_ONE,
wenn es wirklich (syntaktisch) derselbe Code ist, reicht es aus, wenn du eine generische Methode deklarierst:
private void ChangeSelectionSet<T>(List<T> devList) where T : Device { // ... }
Da MyDevice von Device erbt, ist es ja automatisch auch ein Device.
Du darfst jetzt aber dann KEINE MyDevice-Methoden innerhalb aufrufen (wenn doch, dann mußt du die Methoden in Device virtuell machen und in MyDevice überschreiben).
-
Manchmal ist es zu einfach
-
Th69 schrieb:
Hallo THE_ONE,
wenn es wirklich (syntaktisch) derselbe Code ist
ja ist er!
Th69 schrieb:
Hallo THE_ONE,
, reicht es aus, wenn du eine generische Methode deklarierst:
private void ChangeSelectionSet<T>(List<T> devList) where T : Device { // ... }
Danke genau das habe ich gesucht!
hustbaer schrieb:
BTW: mit C# 4.0 sollte das dann glaube ich endlich erledigt sein. Stichwort Covariance von Generics und so. Hilft dir aber vermutlich *jetzt* nicht viel
hab etwas dazu im Internet gesucht und bin auf dass hier gestoßen (Ist zwar Java, aber das wird dann in C# wahrscheinlich auch so funktionieren):
http://www.fh-wedel.de/~si/seminare/ws05/Ausarbeitung/5.generics/genjava3.htm
-> genau das wäre auch eine Lösung!
-
Knuddlbaer schrieb:
Manchmal ist es zu einfach
Vorallem für Klugscheißer.
Hast Du die Grundlagen schon durch?
-
Da bin ich doch froh das Deine Antwort auf die eigentliche Frage "Premature Optimizing" war. War die Frage im aller ersten Post für den Profi zu schwer oder deren Antwort nicht würdig !?
-
Da versucht nur einer mich schlecht zu machen, der Klugscheisser Post war nicht von der gleichen Person wie die beiden anderen loks-Posts in diesem Thread.
-
Tjoa du könntest sowas umgehen indem du dich anmeldest, dann entstehen auch nicht so sinnfreie Diskussionen
-
Firefighter schrieb:
Tjoa du könntest sowas umgehen indem du dich anmeldest, dann entstehen auch nicht so sinnfreie Diskussionen
Mag sein. War ich sogar schonmal vor langer Zeit. Aber solange wie hier im Forum jeder anonym posten kann sehe ich die Anmeldung nicht ein.