В некоторых местах моей программы мне нужен доступ к конкретной реализации объекта (Test), а в других местах мне нужен только интерфейс только для чтения (ITest). Это сделано для того, чтобы пользователь не предполагал, что все свойства установлены и могут быть изменены
Например, если пользователь вызывает TestFactory. Поиск в возвращенной коллекции не позволит им изменить свойство A и использовать CollectionB (он не установлен внутри функции). Я хотел бы иметь возможность использовать инициализаторы объектов и сохранить имена свойств одинаковыми. У меня есть следующее решение:
public interface IReadOnly
{
int Id{ get; }
string Name{ get; }
}
public class ClassA : IReadOnly
{
int Id{ get; internal set; }
string Name{ get; set; }
}
public interface ITest
{
int Id{ get; }
IReadOnly A { get; }
}
public class Test : ITest
{
private ClassA classA = new ClassA();
int Id{ get; internal set; }
IReadOnly ITest.A{ get{ return classA; } }
public ClassA A
{
get
{
return classA;
}
set
{
classA = value;
}
}
public IEnumerable<string> CollectionB {get;set;}
}
public static class TestFactory
{
IEnumerable<ITest> Search(){ /**/ }
Test Read(){ /**/ };
}
Есть ли лучший способ решить эту проблему и злоупотребляет ли концепция явной реализации интерфейса?