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.
You CAN use both get and set in interface property!
Interfaces can inherit from one or more interfaces. The derived interface inherits the members from its base interfaces. A class that implements a derived interface must implement all members in the derived interface, including all members of the derived interface's base interfaces.
An interface may inherit from multiple base interfaces, and a class or struct may implement multiple interfaces. Interfaces can contain methods, properties, events, and indexers. The interface itself does not provide implementations for the members that it declares.
No need, when your base class is implementing interface or other classes all the properties and functionality introduced in base class will inherit to derived class.
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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With