Код: Выделить всё
public class Wheel
{
internal Wheel() { }
public int Spokes { get; init; }
}
Теперь у меня есть класс Bicycle, который содержит два экземпляра. класса Wheel:
Код: Выделить всё
public class Bicycle
{
private readonly Wheel _frontWheel = new();
private readonly Wheel _rearWheel = new();
public int FrontWheelSpokes
{
get => _frontWheel.Spokes;
init => _frontWheel.Spokes = value;
}
public int RearWheelSpokes
{
get => _rearWheel.Spokes;
init => _rearWheel.Spokes = value;
}
}
Код: Выделить всё
Bicycle bicycle = new() { FrontWheelSpokes = 32, RearWheelSpokes = 24 };
Свойство только для инициализации или индексатор 'Wheel.Spokes ' может быть назначен только в инициализаторе объекта или на 'this' или 'base' в конструкторе экземпляра или методе доступа 'init'.
Онлайн demo.
Могу ли я что-нибудь сделать, чтобы исправить ошибки компиляции, не ставя под угрозу "только инициализацию" свойств Wheel.Spokes, Bicycle.FrontWheelSpokes и Bicycle.RearWheelSpokes? Кроме того, я не хочу выставлять конструктор класса Wheel на внешнюю стену. Только сам Bicycle должен создавать экземпляры своих колес. Замена свойств только для инициализации параметрами конструктора также крайне нежелательна. Форма публичного API Bicycle оптимальна сама по себе, я не хочу ее менять.
Обновление:< /strong>
Шинго опубликовал блестящее решение этой упрощенной проблемы, которое, к сожалению, не решает мою реальную проблему, которая немного сложнее. Класс Bicycle предоставляет два свойства класса Wheel, предназначенные только для инициализации, а не только Spokes. Допустим, у Колеса тоже есть это:
Код: Выделить всё
public bool DiskBrake { get; init; }
Код: Выделить всё
public bool FrontWheelDiskBrake
{
get => _frontWheel.DiskBrake;
init => _frontWheel.DiskBrake = value;
}
public bool RearWheelDiskBrake
{
get => _rearWheel.DiskBrake;
init => _rearWheel.DiskBrake = value;
}
Код: Выделить всё
Bicycle bicycle = new()
{
FrontWheelSpokes = 32,
RearWheelSpokes = 24,
FrontWheelDiskBrake = true,
RearWheelDiskBrake = false
};
Подробнее здесь: https://stackoverflow.com/questions/785 ... osed-class
Мобильная версия