Наследование свойств с модификатором доступности в C # - PullRequest
9 голосов
/ 24 сентября 2011

Я попытался унаследовать интерфейс и сделать некоторые из автоматически сгенерированных свойств набора частными.Это пример.

public class MyClass
{
    public interface A 
    {
        int X {get; set;}
    }
    public interface B : A
    {
        int Y {get; set;}
    }

    public class C : A
    {
        public int X {get; private set;}
    }

Когда я пытался его скомпилировать.Я получил ошибку 'MyClass.C' does not implement interface member 'MyClass.A.X.set'. 'MyClass.C.X.set' is not public..

Я пытался с private set; в iterface A, но я снова получил эту ошибку: 'MyClass.A.X.set': accessibility modifiers may not be used on accessors in an interface.

Разрешен ли этот модификатор доступности в C #?

Ответы [ 5 ]

24 голосов
/ 24 сентября 2011

Я пробовал с закрытым набором;в интерфейсе A, но я снова получил эту ошибку

Если ваш интерфейс требует только, чтобы свойство было извлекаемым, вы определяете его как:

public interface A 
{
    int X {get;}  // Leave off set entirely
}
1 голос
/ 24 сентября 2011

Объявление интерфейса определяет открытый набор членов, который должен иметь тип реализации. Таким образом, если C реализует A, он должен иметь открытый член для каждого члена, определенного интерфейсом.

A определяет, что любой тип реализации должен иметь открытое свойство X с открытым и открытым сеттерами C не соответствует этому требованию.

0 голосов
/ 24 сентября 2011

Я считаю, что члены интерфейса должны быть публичными, если сам интерфейс публичный. Из-за этого ваша реализация свойства является ошибочной.

0 голосов
/ 24 сентября 2011

Нет, это не разрешено. Помните, что код, использующий экземпляр class C , должен быть в состоянии обработать его как interface A, что означает, что контракт является открытым геттером и сеттером для свойства X.

Это относится как к наследованию классов, так и к наследованию интерфейса - вы должны следовать договору типа, от которого вы производны.

Если целью кода является то, что свойство X не должно иметь общедоступного установщика, то интерфейс должен быть определен только с помощью { get; }

0 голосов
/ 24 сентября 2011

Вы можете думать об интерфейсе как о минимальной функциональности, которую должен реализовать ваш класс. Если интерфейс указывает, что свойство предоставляет предложения get и set, то вы должны реализовать в своем классе открытые предложения get и set, поскольку только открытые методы и свойства могут неявно реализовывать интерфейсы.

Вы можете просто пропустить ключевое слово set в определении свойства интерфейса, если вы не хотите показывать публичный мутатор. Затем вы можете сделать мутатор реализации либо общедоступным, либо личным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...