Search code examples
c#interfacegetter-setter

Adding a setter to a derived interface


Is it possible somehow to achieve this behavior in C#:

public interface IReadOnly
{
    Data Value { get; }
}

internal interface IWritable : IReadOnly 
{
    Data Value { get; set; }
}

I want to be able to expose a readonly interface to outside assemblies, but use a writable interface internally (which I could also implement in different ways).

I know I can use an abstract class which implements IReadOnly but adds setters, but that forces me to derive all internal implementations from that class.


Solution

  • This isn't a problem:

    public interface IReadOnly {
        Data Value { get; }
    }
    
    internal interface IWritable : IReadOnly {
        new Data Value { get; set; }
    }
    
    internal class Impl : IWritable {
        public Data Value { get; set; }
    }
    

    The Impl.Value property implementation takes care of both IReadOnly.Value and IWritable.Value, as demonstrated in this test snippet:

            var obj = new Data();
            var target = new Impl();
            var irw = (IWritable)target;
            irw.Value = obj;
            var iro = (IReadOnly)target;
            System.Diagnostics.Debug.Assert(Object.ReferenceEquals(iro.Value, obj));