Read /Write (Indexer) via Interface kapseln
-
Hallo Leute,
ich habe mir sowas vorgestellt:
public interface IRead { float this[string name] { get; } } public interface IWrite { float this[string name] { set; } } public class Impl : IRead, IWrite { public float IRead.this[string name] { get { throw new NotImplementedException(); } } public float IWrite.this[string name] { set { throw new NotImplementedException(); } } }
nun sind die pulbich modfiziert nicht erlaubt, da explicites interface.. wie könnte ich denn sowas umsetzen.. im notfall mit ner setter und getter methode... aber gehts auch via Indexer??
Grüßle
-
Laß "public" dort einfach weg:
public class Impl : IRead, IWrite { float IRead.this[string name] { get { throw new NotImplementedException(); } } float IWrite.this[string name] { set { throw new NotImplementedException(); } } }
Durch die Interfaces sind diese automatisch "public".
Du müßtest jedoch hierbei immer explizit auf die Interfaces casten:Impl impl = new Impl(); (impl as IWrite)["test"] = 42; float x = (impl as IRead)["test"];
Wäre es nicht so besser?
public class Impl : IRead, IWrite { public float this[string name] { get { return 0; } set { /* ... */} } }
s.a. Ideone-Code
-
Genial, aber wenn ich es ohne castten machen will, hab ich es so gemacht:
public interface IReadWrite: IRead, IWrite { new float this[string name] { get; set; } } public interface IREad { float this[string name] { get; } } public interface IWrite { float this[string name] { set; } }
Das klappt sogar
-
Es geht wegen dem Casten nur um die explizite Implementierung, d.h. auch bei dem interface IReadWrite hättest du dieselbe Problematik.
-
Ich finde das "new" in IReadWrite auch einigermassen übel. Wieso new? Da is nix new. Soll ja eigentlich gar nicht gehen dass es unterschiedliche Implementierungen dahinter gibt.
-
Absolut, das mit "new" ist Blödsinn. :p
Danke Jungs