Страницы

Поиск по вопросам

воскресенье, 1 марта 2020 г.

Делегирование свойств в C#

#c_sharp


Допустим, есть класс с неким свойством:

class C {
    public int property { set; get; }
}


Хочу в другом классе прокинуть это свойство через член класса. Очевидное решение такое:

class D {
    private C c = new C();
    public int property {
         set { c.property = value; }
         get { return c.property; }
    }
}


Есть ли какой-то упрощенный синтаксис для этого?

Условно: 

public int property => c;


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


Ответы

Ответ 1



Такого делегирования нет. Если нужно вытащить все свойства вложенного объекта, то у вас два пути: Предоставить доступ к вложенному объекту напрямую через свойство. Контроль вы теряете, зато код будет чистым. Унаследоваться от вложенного объекта. Часто это совершенно некорректно (следите за соблюдением отношения is-a), но с точки зрения языка вы получаете требуемое поведение. Контроля нет, архитектура сомнительная, зато сато самый краткий вариант. Если нужно вытащить некоторые свойства, при этом всё остальное важно скрыть, то есть следующие варианты: Не полениться и сделать всё вручную. Упрощённый синтаксис из C# 7 вам уже подсказали. Этот подход даёт максимальный контроль над безопасностью и архитектурой, но этот вариант самый многословный. Выделить необходимые свойства в интерфейс, реализовать его во вложенном объекте, предоставить наружу объект в виде интерфейса. Контроль достаточный (можно привести тип, но это уже на совести приводящего), архитектура и синтаксис разумные, чистота кода средненькая. Самый компромиссный вариант. Из минусов — требуется доступ к классу вложенного объекта, потому что extension everything до сих пор нет.

Ответ 2



Класс можно написать вот так class D { private C c = new C(); public int property { set => c.property = value; get => c.property; } } Вот такие выражения set => c.property = value; называются Expression-bodied function members и появились в C# 6 версии.

Комментариев нет:

Отправить комментарий