#c#
#c#
Вопрос:
У меня есть класс, который я хочу сделать свойством другого класса. Однако я хочу, чтобы только этот другой класс мог иметь свойство этого 2-го класса.
Я думал, что создам вложенный частный класс. Однако при этом возникает ошибка компилятора: «Несовместимая доступность»
class OuterClass
{
public InnerClass MyInnerClass { get; set; }
private class InnerClass
{
public bool CanItBe { get; set; }
}
}
class DifferentClass
{
public InnerClass IWantThisToNotBePossible { get; set; }
}
Обновление: проблема, которую пытаются решить
Class Bicycle
{
public WheelSettings MyWheelSettings {get;set;}
}
Class WheelSettings
{
public decimal SpokeLength {get;set;}
}
Class SteeringWheel
{
public WheelSettings MyWheelSettings {get;set;} ==> i want this to be
an error -> WheelSettings class cannot be used in any class other than
Bicycle
}
Комментарии:
1. Вы должны сделать
InnerClass
тип общедоступным, чтобы другие классы, которые создают экземпляр,OuterClass
моглиget
иset
MyInnerClass
свойство.2. Я не думаю, что это возможно (создать тип, который другие классы могут создавать, но не предоставлять как свойство), но было бы полезно, если бы вы описали, какую проблему вы пытаетесь решить здесь. Может быть какой-то другой способ.
3. Вы не можете этого сделать. Если вы хотите прояснить, для чего предназначен класс, назовите его лучше:
BicycleWheelSettings
.4. @Blorgbeard -> это решение, которое я тоже придумал.
5. Прохладный. В качестве дополнительного обоснования того, почему вы не можете: свойства — это просто синтаксический сахар вокруг методов getter и setter. Вы бы на самом деле не хотели создавать правило, согласно которому «никакие методы вне этого класса не могут принимать или возвращать параметры этого типа» — что, если я захочу реализовать некоторую сложную логику в моем
BicycleSpeedCalculator
? Я должен передать всеBicycle
вместо того, чтобы смотреть только наWheelSettings
?
Ответ №1:
Это невозможно сделать. Если ваш класс предоставляет свойство или метод, возвращающий WheelSettings
, класс должен быть общедоступным, чтобы любой другой класс мог видеть, что он существует, и знать, что внутри него.
По правилам C # это означает, что любой код, который может видеть, что этот класс существует, может содержать ссылку на него. Это может быть локальная переменная, поле или возвращаемый методом.
Если вы действительно хотите, чтобы никто не мог неправильно понять назначение вашего класса, вы можете создать общедоступный интерфейс.
public class Bicycle {
public IWheelSettings MyWheelSettings { get; set; } = new WheelSettings();
public interface IWheelSettings {
decimal SpokeLength { get; set; }
}
private class WheelSettings : IWheelSettings {
public decimal SpokeLength { get; set; }
}
}
Таким образом, вы можете запретить кому-либо создавать экземпляры IWheelSettings
, поскольку ни один класс, который его реализует, не является общедоступным.
Конечно, ничто не мешает мне реализовать его самостоятельно.
Кстати, любой другой класс в любом случае должен был бы квалифицироваться WheelSettings
с Bycicle
, поэтому довольно очевидно, что его уже не следует использовать в другом контексте.
public class Car {
public Bicycle.WheelSettings settings;
}
РЕДАКТИРОВАТЬ: Кроме того, учтите это: если на экземпляры WheelSettings
никогда не следует ссылаться без Bicycle
, почему он существует? Почему настройки колеса не являются свойствами самого Bicycle
?