проблема доступа - PullRequest
       19

проблема доступа

0 голосов
/ 01 июля 2010

Мне было интересно, нельзя ли настроить аксессор, чтобы позволить вам получить доступ к переменной аксессора. Пример ошибки:

    public void Main()
    {
        Object.name = "test"; //Can't access the object's subproperties
    }

    Objec ob = new Objec();
    public Objec Object
    {
        get { return ob; }
        set { ob = value; }
    }
class Objec
{
    string name;
    string value;
}

Есть ли что-то, что можно сделать выше (кромеаксессоры для каждого значения)?
Спасибо,
Макс

РЕДАКТИРОВАТЬ: Вот лучший пример

    public void Main()
    {
        //Now I can't change the X or Y properties, this will display an error
        ThePoint.X = 10;
        //To change the x value, I need to do the following:
        ThePoint = new Point(10,0);
    }

    private Point Poi = new Point();
    public Point ThePoint
    {
        get { return Poi; }
        set { Poi = value; }
    }

Есть ли способ заставить 'ThePoint.X' работать (без публичного показа 'Poi')?

Ответы [ 6 ]

2 голосов
/ 02 июля 2010

Хорошо, с вашим новым примером ясно, в чем проблема: вы ведете себя так, как будто Point - это класс, тогда как на самом деле это структура.

Когда вы говорите ThePoint.X = 10;, все, что вы делаете, это изменяете X для копии исходной точки. Это потому, что структура всегда передается по значению, а не по ссылке.

Короче говоря, ошибка в ваших ожиданиях.

2 голосов
/ 01 июля 2010

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

Попробуйте:

class Program
{
    public static void Main(string args[])
    {
        MyClass instance = new MyClass();
        instance.Child.ChildValue = "something";
    }
}

public class MyClass
{
    // The following code declares Public Properties 
    // rather than private variables.

    public string Value { get; set; }
    public string Name { get; set; }
    public MyChild Child { get; set; }

    public MyClass()
    {
        this.Child = new MyChild();
    }
}

public class MyChild
{
    public string ChildValue { get; set; }
}
1 голос
/ 01 июля 2010

Вы должны указать public для каждого члена класса, который вы хотите показать в C #.

Согласно спецификации C # :

Члены класса, включая вложенные классы и структуры, могут быть открытыми, защищенными внутренними, защищенными, внутренними или частными.Уровень доступа для членов класса и членов структуры, включая вложенные классы и структуры, по умолчанию является закрытым.

1 голос
/ 01 июля 2010

Вы должны сделать переменные name и value общедоступными, чтобы ваше решение компилировалось.Или еще лучше, используйте автоматические свойства.

0 голосов
/ 02 июля 2010

Ответ на ваш актуальный вопрос: «Есть ли что-нибудь, что можно сделать выше (кроме создания аксессоров для каждого значения)?»НЕТ.

Угадывая немного о своих намерениях, вы, похоже, хотите следовать шаблону проектирования, известному как Bridge (ваш класс является абстракцией вокруг реализации Object и / илиPoint).Вы будете выставлять аудитории своего класса только те части исходной реализации, которые вы хотите, в случае вашего вопроса, каждое значение.

0 голосов
/ 01 июля 2010

Вам необходимо внести следующие изменения:

public void Main()
{
    Object.name = "test"; //Can access the object's properties now...
}

Objec ob = new Objec();

public Objec Object
{
    get { return ob; }
    set { ob = value; }
}

public class Objec
{
    public string name {get; set;}
    public string value {get; set;}
}
...