ERLEDIGT
NEIN
NEIN
ANTWORTEN
26
26
ZUGRIFFE
877
877
EMPFEHLEN
-
also als beispiel habe ich eine Klasse Auto.
auto besitzt die attribute Farbe und Marke.
dann Habe ich die Klassen
Alle Autos mit der Liste ListeAutos hier sind alle Autos die es gibt abgelegt.
dann gibt es die Klasse AutoFarbe
wobei die Instanz BlauesAuto von AutoFarbe eine Liste mit allen blauen Autos beinhaltet
eine Instanz RotesAuto von AutoFarbe eine Liste mit allen roten Autos.
und das selbe nochmal für Marken.
wenn jetzt ein Auto Zerstört wird muss ich das ja überall löschen.
da ich aber von AutoFarbe und Marke unendlich viele Instanzen haben kann wäre es schön wenn ich es einfach irgendwo lösche und in jeder liste verschwindet.
-
Aha, was du meinst ist wahrscheinlich kein Attribut sondern eine Eigenschaft (Property), richtig?
Du könntest das mit Hilfe von Events lösen.
Du gibst der Auto-Klasse eine Methode "ZerstöreMich", welche dann ein Event "IchWurdeZerstört" auslöst. Alle Instanzen, die eine Referenz auf das Auto speichern, abonnieren das Event und im Eventhandler entfernst du das zerstörte Auto aus der Liste.hihi = -h²
-
26.12.10 22:15 #18
Und warum brauchst du die Listen für die Marke, rote und blaue Farbe, wenn du die Autos bereits in einer Autoliste drin hast? Damit erstellst du nur unnötige "Verlinkungen" und hast im Endeffekt das Problem, das du jetzt hast, du musst nämlich mit allen Listen gleichzeitig arbeiten o.O Eine Liste, in der alle Fahrzeuge drin sind, reicht doch vollkommen aus oder nich?
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
Hallo,
hmm wo genau ist der unterschied zwischen einen Attribut und einer Eigenschaft?
ein Attribut ist ja eine Variable in einer Klasse und eine Eigenschaft?
Also ein Button kann zum Beispiel die Eigenschaft Visible haben, aber das sah ich bisher auch nur als Variable an.
An sowas wie diese Zerstör mich Methode dachte ich, aber die muss ja dann irgendwie auf die Listen zugreifen können oder?
kannst du mir bitte noch etwas genauer erzählen wie das Funktioniert?
der Vorteil an verschiedenen Listen ist die Verarbeitung.
wenn du zum Beispiel alle blauen Autos auf irgend etwas Bestimmtes gegen seitig vergleichen willst, dann hast du bei insgesamt 1000 Autos und davon 20 blaue Autos
20 * 19 = 380 vergleiche die du machen musst, wenn du weißt welche Autos blau ist, also in einer eigenen Liste liegen.
oder 1000*999 = 999000 überprüfungen ob ein Auto blau ist und 380 eigendliche vergleiche auf den Wert.
also 999380 berechnungen zu 380 berechnungen.
klar?
gruß und dank
-
27.12.10 09:15 #20
Einleuchtend ist es zwar, aber was willst du machen, wenn weitere Farben dazukommen oder andere Eigenschaften der Fahrzeuge auch so "unter die Lupe genommen" werden, willst du dann für alles eine Liste anlegen? Die Veränderungen in deinem Code werden dann aber gewaltig werden.
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
das mit dem auto ist nur ein beispiel,
im wirklichen projekt ist es anders, aber es gibt hier eine feste anzahl von "farben".
jedenfalls wird die rechenzeit dadurch weit verkürzt.
denoch besteht das problem mit dem löschen
-
Eigenschaften, Variablen und Attribute sind drei verschiedene Dinge.
Attribute sind dafür da um Kennzeichnungen bereitzustellen. So kannst du beispielsweise mit dem Serializable-Attribut festlegen, dass eine Klasse serialisierbar ist.
Eigenschaften definieren Zugriffe auf Variablen.
Mehr Infos findest du im Netz, z.B. hier: Eigenschaften (C#), Attribute (C#)
Wenn du 1000 Autos und davon 20 blaue Autos hast und diese 20 blauen Autos alle miteinander vergleichen möchtest, dann brauchst du aber keine 999000 Berechnungen sondern du musst nur über die 1000 Autos iterieren und alle blauen herausfiltern. Das sind 1000 Überprüfungen plus deine 380. Das Filtern kannst du zum Beispiel mit Linq machen:
Wie du Events verwendest kannst du auch im Internet finden. Einfach malCode csharp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
private class Auto { } private class BlauesAuto : Auto { } static void Autotest { // Liste mit 980 Autos und 20 blauen Autos füllen List<Auto> AlleAutos = new List<Auto>(); for (int i = 0; i < 979; i++) { AlleAutos.Add(new Auto()); } for (int i = 0; i < 19; i++) { AlleAutos.Add(new BlauesAuto()); } // Alle blauen Autos herausfiltern: IEnumerable<Auto> AlleBlauenAutos = AlleAutos.Where(AktuellesAuto => AktuellesAuto is BlauesAuto); // Jetzt sind in "AlleBlauenAutos" alle blauen Autos enthalten und du kannst sie gegenseitig vergleichen }
benutzen.
Geändert von Shakie (27.12.10 um 13:42 Uhr)
hihi = -h²
-
ja gut aber dann legst du dir ja temporer eine neue Liste mit allen blauen Autos an.
da ich die teillisten jedoch immer mal wieder brauche und ich von weit mehr als 1000 einträgen ausgehe, macht meiner Meinung eine Aufteilung und verschiedenen Listen mehr sinn.
Was ich an diesen Events noch nicht ganz verstehe.
Wenn Auto eine Zerstör Methode bekommt, wie soll Auto sich dann selbst aus der Liste Entfernen, ohne Zugriff auf die Klasse zu haben in der die Liste liegt?
ich wollte das topic mal anpassen, leider ging das nicht.
gruß und dank
-
Das Auto löst lediglich ein Event aus, dass es zerstört wurde. Die Klasse, in der die Liste liegt, reagiert auf das Event und entfernt den Sender des Events (das Auto) aus der Liste.
hihi = -h²
-
also die sache mit den Events gefällt mir,
ich verstehe die wie ein Interrupt bei einen µ-controller
habe dazu zwar mehre Bsp im Netz gefunden, aber so richtig, verstehe ich die Syntaks noch nicht.
also in unserem bsp
bekommt Auto folgendes
undCode :1 2
public delegate void EventHandler(int id); public event EventHandler EventAutoZerstoeren;
Code :1 2 3 4 5 6 7
public zerstoerAuto() { if (EventAutoZerstoeren!= null) { EventAutoZerstoeren(this.id); } }
und die klasse AutoFarbe mit der Liste bekommt
Code :1 2 3 4
private void EventAutoZerstoeren(int id) { AutoFarbListe.Remove(id); }
und die Klasse AutoMarke mit der Liste bekommt auch
Code :1 2 3 4
private void EventAutoZerstoeren(int id) { AutoMarkenListe.Remove(id); }
wenn ich jetzt von einer Instanz der Klasse Auto die Methode ZerstoerAuto aufrufe, werden automatisch die Events ausgeführt.
was ist aber das:
also ich lege mir hier mein Event an, bzw sage ihm das es das irgendwo gibt und weise ihm anschließend einen Event Handler zu.Code :1 2
public delegate void EventHandler(int id); public event EventHandler EventAutoZerstoeren;
Woher weißt er jetzt aber wo die Events stehen, also in welchen Instanzen?
ich sage Ihm ja nicht das es Events sind, es könnten ja auch normale Methoden sein, was sie ja auch sind.
und was bedeutet wenn EventAutoZerstoeren == null ist. Also ich habe rausgelesen das passiert wenn kein EventHandler existiert, aber wann ist das der Fall?Code :1
if (EventAutoZerstoeren != null)
Edit bei mir ist der immer null.
verstehe ich das richtig?
dankeGeändert von FJK (29.12.10 um 21:54 Uhr)
-
http://openbook.galileocomputing.de/....htm#Xxx130362
Du musst dein Ereignis noch abonnieren.
Und auch noch aus dem Buch
4.8 Zuweisungen und Ereignisse downtop
Zuweisungen (delegate) sind eine typensichere, objektorientierte Implementierung von Funktionszeigern und werden in vielen Situationen eingesetzt, in denen eine Komponente die Komponente aufrufen muss, die sie verwendet. Zuweisungen werden weitestgehend als Grundlage für Ereignisse eingesetzt, die das einfache Registrieren von Zuweisungen für ein Ereignis ermöglichen. Zuweisungen werden in Kapitel 22 ausführlich behandelt.
In den .NET-Frameworks finden Zuweisungen und Ereignisse breite Anwendung.
-
ja das delegate kenne ich noch aus c++ Zeiten, wobei es hier nie ausgeschrieben wurden ist.
Aber es dient dazu, den Compiler zu sagen das es die Funktion mit diesen übergabe und rückgabe Parameter irgendwo gibt.
Aber das mit dem Abonieren verstehe ich nicht ganz, hast du noch ein Bsp Code mit Komentaren?
Bzw kannst mir das nochmal genauer erklären?
gruß und dank
Ähnliche Themen
-
Referenzen zurückgeben
Von hoctar im Forum PHPAntworten: 5Letzter Beitrag: 05.08.10, 12:51 -
dll referenzen
Von DerStauner im Forum .NET Windows FormsAntworten: 5Letzter Beitrag: 25.04.09, 09:10 -
Referenzen
Von Nob im Forum PHPAntworten: 3Letzter Beitrag: 24.04.07, 20:34 -
Instanzen/Referenzen
Von Mendragol im Forum Autodesk Maya (ehemals Alias)Antworten: 2Letzter Beitrag: 11.12.05, 21:58 -
C Referenzen
Von FactorX im Forum C/C++Antworten: 3Letzter Beitrag: 01.05.02, 16:10





Zitieren
Login





