Generics mit "Zirkulärer Typreferenz"



Hallo allerseits!

In meinem Programm möchte ich Objekte als Weak Reference in einem
generischen Cache speichern. Diese Objekte sollen folgendes generische
Interface implementieren:

internal interface ICacheable<T> where T : class
{
Cache<T> Cache
{
get;
set;
}

int Key
{
get;
set;
}
}

Über den Key wird das Objekt identifiziert, der Verweis auf den Cache
ermöglicht es, wenn das Objekt vom GC entsorgt wird, den Verweis aus dem
Cache zu löschen:

public class SomeObject : ICacheable<SomeObject>
{
~SomeObject()
{
((ICacheable<SomeObject>)this).Cache.Remove(
((ICacheable<SomeObject>)this).Key);
}

// ICacheable<SomeObject>-Member
}

Der Cache dazu sieht - vereinfacht - so aus:

internal class Cache<T> where T : class
{
private Dictionary<int, WeakReference> mItems;

public void Add(ICacheable<T> item)
{
mItems.Add(item.Key, new WeakReference(item));
item.Cache = this;
}

public bool Remove(int key)
{
return mItems.Remove(key);
}
}

Grundsätzlich funktioniert das auch recht gut. Nur würde ich bei der
Definition von ICacheable<T> und Cache<T> noch folgendes sicherstellen:

? Bei ICacheable<T> soll T immer vom Typ der Klasse sein, die dieses
Interface implementiert. Folgendes soll also nicht gehen:

class SomeObject : ICacheable<SomeOtherObject>

? Cache<T> soll als Typ nur Klassen zulassen, die auch ICacheable<T>
implementieren.

class Cache<T> where T : class, ICacheable<T>

führt leider zu einem Fehler.

Gibt es eine Möglichkeit, das zu realisieren?

TIA

Grüße
Thomas

--
Any problem in computer science can be solved with another layer
of indirection. But that usually will create another problem.
David Wheeler
.



Relevant Pages

  • Re: kobj multiple inheritance
    ... The kobj lookup scheme doesn't require any kind of locked memory ... >> This proposed scheme also traverses through base classes of base classes ... >> Interface lookup using current kobj can be done expliticly. ... The cache is large even ...
    (freebsd-arch)
  • Cisco 7204VXR Interface ignored packet
    ... see the configuration not just the show diag & interface info. ... 509K bytes of non-volatile configuration memory. ... 256 max cache size, 256 in cache ... 22496866 hits in cache, 0 misses in cache ...
    (comp.dcom.sys.cisco)
  • Re: [PATCH 08/28] SECURITY: Allow kernel services to override LSM settings for task actions [try #2]
    ... interface, at the granularity you want to support distinctions to be made. ... context and begin caching". ... Do any of the interfaces allow a task to act on a cache other than one ...
    (Linux-Kernel)
  • Re: instanciate an interface - alternatives?
    ... > I know that it is not possible to instanciate an interface. ... It is not a matter of workarounds. ... > It shall look up if this object is stored in the cache, if not it shall> create it and automatically load its data:> ... > private Hashtable cache = new Hashtable; ...
    (comp.lang.java.programmer)
  • Re: =?ISO-8859-15?Q?Cluster-f=E4hige_JavaSpaces-Implementierun?= =?ISO-8859-
    ... Sicherlich gibt es zig Möglichkeiten sowas zu implementieren, aber die ersten Tests mit der neuen Version von "GigaSpaces Caching Edition" beweisen jedenfalls eine sehr gute Perforamnce. ... haben wir uns zwar überlegt, aber es sind so viele Web-Server betroffen, dass es unsinnig ist hier überall die Daten zu replizieren, wenn sie im Normalfall nur von einigen Servern gebraucht werden. ...
    (de.comp.lang.java)