9

Когда я определить интерфейс, который содержит только для записи свойства:Возможно ли реализовать свойство setter явно при наличии доступного геттера?

public interface IModuleScreenData 
{ 
    string Name { set; } 
} 

и попытка (простодушно) осуществлять его явно с намерением на имущество также иметь общедоступную поглотитель:

public class ModuleScreen : IModuleScreenData 
{ 
    string IModuleScreenData.Name { get; set; } 
} 

тогда я получаю следующее сообщение об ошибке:

Error 'IModuleScreenData.Name.get' adds an accessor not found in interface member 'IModuleScreenData.Name'

ошибка более или менее ожидаемо, однако, после этого альтернативного синтаксиса:

public class ModuleScreen : IModuleScreenData 
{ 
    public string Name { get; IModuleScreenData.set; } 
} 

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

ответ

10

Вы можете сделать это:

public class ModuleScreen : IModuleScreenData 
{ 
    string IModuleScreenData.Name 
    { 
     set { Name = value; } 
    } 

    public string Name { get; private set; } 
} 

Об одном Обратите внимание, что я обычно не рекомендую устанавливать только свойства. Метод может работать лучше, чтобы выразить намерение.

+0

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

+0

Спасибо за это ... –

-1

Вы не можете изменить способ реализации интерфейса в классе наследования. В этом весь смысл. Если вам нужно сделать что-то новое с помощью свойства, вы можете создать новое свойство, которое ссылается на реализацию наследуемых свойств. Интерфейсы есть, поэтому вы можете соответствовать указанному стандарту для наследования объектов.

UPDATE: На второй мысли .. вы должны быть в состоянии только сделать это .... это будет компилироваться:

public class ModuleScreen : IModuleScreenData 
    { 
     public string Name { get; set; } 
    } 
+0

Я хотел бы избежать создания нового имущества, если это возможно. Не уверен, что вы подразумеваете, изменив способ реализации интерфейса. Я понимаю, что мне нужно выполнить контракт, содержащийся в интерфейсе, и явная реализация, безусловно, является одним из способов сделать это. –

+0

См. Мое обновление .... вы должны просто добавить get и удовлетворить интерфейс – miskiw

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