Laden...

Properties "überwachen", ohne die Klasse zu ändern

Erstellt von Friedel vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.193 Views
Friedel Themenstarter:in
830 Beiträge seit 2005
vor 17 Jahren
Properties "überwachen", ohne die Klasse zu ändern

Hallo,

ich habe eine Klasse (vorgegeben), an welcher ich nichts ändern kann. Ich würde aber gerne mitbekommen (Event), wenn sich eine Eigenschaft ändert.

Geht so was ?

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

D
128 Beiträge seit 2005
vor 17 Jahren

Moin Friedel!

Ich kenne mich da selber noch nicht diesbezueglich so gut aus, aber ich denke, dass geht in Richtung Observer Pattern.

Schau mal, ob Dir der folgende Link weiterhilft:

Observer

Gruss, DaMoe

P.S.: Angaben ohne Gewaehr 😉

347 Beiträge seit 2006
vor 17 Jahren

ich habe eine Klasse (vorgegeben), an welcher ich nichts ändern kann. Ich würde aber gerne mitbekommen (Event), wenn sich eine Eigenschaft ändert.
Geht so was ? Wenn dir die Klasse selbst keinen Event an die Hand gibt kann und wird das nix werden.
Das dafür nötige Level an Abstraktion würde Leistungseinbuße mit sich bringen wie sie ContextBoundObject hat[1] und wäre schlichtweg inakzeptabel für jede Klasse...

[1]Damit geht das um 5 Ecken und 7 Kanten unter Zuhilfenahme von ein paar Hacks, die anscheinend für Remoting in die CLR geschnitten wurden.

360 Beiträge seit 2005
vor 17 Jahren

Mit den hier vorgeschlagenen Lösungswegen habe ich nicht wirklich Erfahrung, Aber was ist denn, wenn du einen Thread startest, der die Eigenschaft regelmäßig abfragt und sofort Alarm schlägt, wenn sich was ändert?

Das mag allerdings nicht so ganz performant sein wie ein ausgelöstes Event...

Gruß,
Markus 🙂

Friedel Themenstarter:in
830 Beiträge seit 2005
vor 17 Jahren

Hallo,

danke für eure Antworten.

@DaMoe
Das funktioniert nicht, da ich meine zu überwachende Klasse nicht ändern kann.

@Robert G
Habe ich mir fast gedacht. Hätte man in die Klasse die INotifyPropertyChanged - Schnittstelle eingebaut, wäre das alles kein Problem.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

Friedel Themenstarter:in
830 Beiträge seit 2005
vor 17 Jahren

Hallo Spontifixus,

grundsätzlich würde das wahrscheinlich funktionieren. Allerdings müsste für jedes zu überwachende Objekt ein Thread (und vermutlich auch Timer) gestartet werden. Bei einer "Überwachung" OK, bei hunderten nicht akzeptabel.

Danke trotzdem

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

2.223 Beiträge seit 2005
vor 17 Jahren

moin

ich kann mich täuschen aber wie wäre die möglichkeit diese klasse abzuleiten

alle propperty's zu überschreiben mit base.foo kannste auf das mutter propperty zugreifen und danch selber das event der änderung feuern

mfg

Friedel Themenstarter:in
830 Beiträge seit 2005
vor 17 Jahren

Hallo blackcoin,

wäre eine Möglickeit, wenn ich die Klasse nur in meinen Klassen nutzen würde. Die Klasse wird in anderen Modulen verwendet und muss deshalb genau in dieser Form erhalten bleiben.

Danke trotzdem

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

2.223 Beiträge seit 2005
vor 17 Jahren

die Mutterklasse würde sich dadurch ja nicht verändern und selbst wenn je nach implemntierung würde sich das auch nicht bemerkbar machen

mfg

Friedel Themenstarter:in
830 Beiträge seit 2005
vor 17 Jahren

Ich habe mich etwas falsch ausgedrückt.

Meine und die fremde Komponente nutzen ein Objekt einer Klasse aus der fremden Komponente. Ich muss mitbekommen wann sich etwas an genau diesem Objekt ändert. Ich kann der anderen Komponente ja kein Objekt der abgeleiteten Klasse "in die Hand drücken" 🙂

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

T
512 Beiträge seit 2006
vor 17 Jahren

Ich würde mal spontan sagen du musst dir einen anderen Ansatz suchen.

Es ändert sich ja nicht einfach so mal was an dem Objekt, weil gerade die Sonne drauf scheint und es anfängt zu grünen. Frag doch an den Stellen ab, an denen du was mit dem Objekt machst, was seinen Zustand ändern könnte, und lös dort ein Event aus.

Meistens reicht es doch sowieso aus nicht genau zu wissen was und ob sich was verändert hat, sondern dass sich was verändert haben könnte und wie der neue Zustand aussieht.

e.f.q.

Aus Falschem folgt Beliebiges

2.921 Beiträge seit 2005
vor 17 Jahren

Ich würde mir eine allgemeine Property-Klasse schreiben, meine Objekte leiten dann von dieser ab:

z.B. über


class PropertyList:SortedList
{
    public T Get<T>(string sKeyName)
    {
        return (T)this[sKeyname];
    }
    public void Set<T>(string sKeyName, T tValue)
    {
         this[sKeyName] = tValue;
         if (Change)
         {
               Change(this,new EventArgs()); //hier eventuell eigene EventArgs definieren
         }
    }
}

hier fehlen natürlich noch die Überprüfungen usw. aber es können properties zur Laufzeit mit Add("Name","Fredel"); zur Laufzeit hinzugefügt und mit PropertyList["Name"] = "Ich heiß jetzt anders" geändert werden. Gleichzeitig wird ien Change event ausgelöst.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

S
8.746 Beiträge seit 2005
vor 17 Jahren

Man denke sich ein Property, welches die aktuelle Uhrzeit zurückliefert.

Nun verrate mir jemand, wie man dazu eine Überwachungfunktion schreiben soll ohne das Property abzurufen.

Man kann Felder überwachen (über den Umweg Property, sofern das Feld ausschließlich über das Property - auch intern - verwendet wird), aber nicht ein Property selbst. Ein Property ist äquivalent zu einer Funktion (ist ja auch eine...) und somit per se zustandslos. Und ohne Zustand keine Änderung.

Solche Änderungsdienste müssen Teil der Architektur sein oder man muss sich Debugger-Technologien bedienen.

Interfaces wie INotifyPropertyChanged sind nur für Spezialfälle gedacht, in denen die o.g. Annahmen erfüllt sind - wie eben beim DataBinding.

2.921 Beiträge seit 2005
vor 17 Jahren

@svenson: Falls Du Dich damit auf meinen Beitrag beziehst, mein Code würde das Event ja auch nur auslösen, wenn das Event gesetzt wird.
Also nur beim konkreten Zugriff. Ist ja auch kein kompletter Code.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.