2014-11-17 2 views
1

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

interface IFoo { 
    string Foo { get; } 
} 

abstract class Bar : IFoo { 
} 

class Baz : Bar { 
    public string Foo { get; private set; } 
} 

Эти дает мне ошибку Bar does not implement interface member IFoo.Foo. Есть ли способ обойти это? Я хочу, чтобы в конечном итоге экземпляр класса определял видимость сеттера.

+0

Возможный дубликат [Добавление атрибута доступа к свойству в классе, который происходит из абстрактного класса с помощью только элемента доступа get) (http://stackoverflow.com/questions/1169571/adding-a-set-accessor- к-а-свойства-в-класс, что-черпает-из-ан-абстрактного-CLA) – bfops

ответ

5

Вы должны реализовать его аннотация:

abstract class Bar : IFoo 
{ 
    public abstract string Foo { get; } 
} 

Однако, это не выглядит, когда вы делаете это, что вы можете переопределить видимость в классе Баз.

Лучшее, что вы можете сделать, это использовать поле подкладочный в производном классе:

class Baz : Bar 
{ 
    private string _foo; 
    public override string Foo 
    { 
     get { return _foo; } 
    } 
} 

This answer на дубликата вопрос переходит в более подробно, почему. Проблема связана с тем, что агенты и сеттеры свойств являются абстрактными, а не самим свойством.

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