0

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

public interface IPrisoner 
{ 
    string PrisonerName { get; set; } 
} 

public class Prisoner : IPrisoner 
{ 
    public string PrisonerName { get; private set; } 
} 

, но в этом случае я получаю сообщение об ошибке:

'Prisoner' does not implement interface member 'IPrisoner.PrisonerName.set'. 'Prisoner.PrisonerName.set' is not public.

Как его реализовать?

+3

Вы можете изменить интерфейс, чтобы разоблачить 'get'. Но что-либо в интерфейсе по умолчанию «public». – juharr

+5

Вы не можете. Интерфейс говорит, что он должен быть общедоступным, поэтому он должен быть общедоступным. В противном случае, что вы ожидаете, если кто-то сделает «Заключенный IPrisoner = новый заключенный(); заключенный. PrisonerName = "Foo"; '? –

+2

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

ответ

1

Похоже, вы контролируете определение интерфейса и можете его изменить. Если это так, то это так же просто, как опуская сеттер из определения свойств на границе раздела, например, так:

public interface IPrisoner 
{ 
    string PrisonerName { get; } 
} 

Это позволит сделать интерфейс только обеспечить поглотитель. При реализации интерфейса, однако, вы вольны определить сеттер с помощью любого модификатора доступа вы хотите, чтобы в вашем вопросе, вы можете просто реализовать интерфейс следующим образом:

public class Prisoner : IPrisoner 
{ 
    public string PrisonerName { get; private set; } 
} 

Если определить сеттер здесь как публичный (IE, пропустите модификатор доступа private), он по-прежнему не сделает его доступным через интерфейс IPrisoner, только ссылки на конкретный тип Prisoner откроют его. Вы можете определить свойства, у которых есть только сеттер и без геттера по интерфейсу таким же образом.

Смежные вопросы