Явная реализация интерфейса и несколько интерфейсов - PullRequest
0 голосов
/ 18 октября 2011

В некоторых местах моей программы мне нужен доступ к конкретной реализации объекта (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(){ /**/ };
}

Есть ли лучший способ решить эту проблему и злоупотребляет ли концепция явной реализации интерфейса?

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Я бы попросил ваш класс Test реализовать оба интерфейса, IReadOnly и ITest.Если вы хотите ограничить доступ сеттера, приведите к IReadOnly, в противном случае используйте ITest или конкретный тест.

0 голосов
/ 18 октября 2011

Может быть, вместо этого создать абстрактный класс, а затем создать подкласс полного доступа и только для чтения?

...