Ich hatte Schwierigkeiten, diese Frage gut zu formulieren, also möchte ich versuchen, sie anhand eines Beispiels zu erklären:
Angenommen, ich habe eine Schnittstelle. Der Einfachheit halber sage ich, die Schnittstelle ist IRunnable
und bietet eine einzige Methode, Run
. (Dies ist nicht real; es ist nur ein Beispiel.)
Nehmen wir nun an, ich habe eine bereits vorhandene Klasse, nennen wir sie Cheetah
die ich nicht ändern kann. Es existierte schon vorher IRunnable
; ich kann nicht machen. es implementiert meine Schnittstelle. Aber ich möchte es verwenden als ob es implementiert IRunnable
-Vermutlich, weil es einen Run
Methode oder etwas Ähnlichem. Mit anderen Worten, ich möchte in der Lage sein, Code zu haben, der eine IRunnable
und arbeitet mit einer Cheetah
.
OK, ich könnte also jederzeit ein CheetahWrapper
eine Art Deal. Aber lassen Sie mich etwas Flexibleres schreiben - wie wäre es mit einem RunnableAdapter
?
Ich stelle mir die Klassendefinition in etwa so vor:
public class RunnableAdapter : IRunnable {
public delegate void RunMethod();
private RunMethod Runner { get; set; }
public RunnableAdapter(RunMethod runner) {
this.Runner = runner;
}
public void Run() {
Runner.Invoke();
}
}
Das ist doch ganz einfach, oder? Damit sollte ich also in der Lage sein, einen Anruf wie diesen zu tätigen:
Cheetah c = new Cheetah();
RunnableAdapter ra = new RunnableAdapter(c.Run);
Und jetzt, voilà: Ich habe ein Objekt, das Folgendes implementiert IRunner
und ist im Grunde seines Herzens ein Cheetah
.
Meine Frage ist: Wenn diese Cheetah
von mir irgendwann aus dem Geltungsbereich herausfällt und an den Punkt gelangt, an dem es normalerweise garbage collected werden würde... wird es das? Oder wird dies RunnableAdapter
das Objekt Runner
Eigenschaft einen Verweis auf das Original Cheetah
damit sie nicht eingesammelt werden? Ich möchte auf jeden Fall, dass dieser Verweis gültig bleibt, also frage ich mich, ob die obige Klassendefinition ausreicht oder ob es notwendig wäre, einen Verweis auf das zugrunde liegende Objekt zu pflegen (z. B. über eine private UnderlyingObject
Eigenschaft), nur um die Garbage Collection zu verhindern.
0 Stimmen
Wow, ziemlich lächerlich, dass ich vergessen habe, diese Tags zu setzen... ja, korrigiert.