In my current project, I need to have both editable and readable versions of classes. Thus, when classes are displayed in a List or PropertGrid, the user cannot edit objects, they are not allowed.
To do this, I follow the design pattern shown in the diagram below. I start with a read-only interface ( IWidget ), and then create an editable class that implements this interface ( Widget ). Then I create a read-only class ( ReadOnlyWidget ) that simply wraps the mutable class and also implements a read-only interface.
I follow this pattern for several different unrelated types. But now I want to add a search function to my program that can generate results that include any number of types, including both mutable and immutable versions. So now I want to add another set of interfaces ( IItem , IMutableItem ) that define properties that apply to all types. Thus, IItem defines a set of universal immutable properties, while IMutableItem defines the same properties as editable ones. As a result, the search will return the IItems collection, which can then be added to more specific types, if necessary.
However, I'm not sure if I am establishing a relationship with IMutable and IItem . Right now I have each of the interfaces ( IWidget , IDooHickey ) inheriting from IItem , and then mutable classes ( Widget , DooHickey ) also implement IMutableItem .
Alternatively, I also thought that I could set IMutableItem inherit from IItem , which would hide its read-only properties with new properties that have both get and set accessors. Then mutable classes implement IMutableItem , and read-only classes implement IItem .
I would appreciate any suggestions or criticism regarding any of this.
Class diagram

code
public interface IItem { string ItemName { get; } } public interface IMutableItem { string ItemName { get; set; } } public interface IWidget:IItem { void Wiggle(); } public abstract class Widget : IWidget, IMutableItem { public string ItemName { get; set; } public void Wiggle() {