Код: Выделить всё
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 предоставляет два свойства класса 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
Мобильная версия