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


Anmelden zum Antworten