Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 448
doe Avatar asked Jul 19 '11 14:07

doe


People also ask

CAN interface have getters and setters C#?

You CAN use both get and set in interface property!

Can you derive an interface from a base interface?

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.

Can an interface be derived from multiple 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.

Does interface needs to be derived?

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.


1 Answers

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)); 
like image 138
Hans Passant Avatar answered Sep 22 '22 19:09

Hans Passant