геттер и сеттер для класса в классе c # - PullRequest
14 голосов
/ 11 мая 2009

Предполагая, что у нас есть класс InnerClass с атрибутами и getter / setter. У нас также есть класс OuterClass, содержащий InnerClass.

, например

class InnerClass
{
    private int m_a;
    private int m_b;

    public int M_A
    {
        get
        {
             return m_a;
        }
        set
        {
             m_a = value;
        }
     }
}

class OuterClass
{
    private InnerClass innerClass
}

Как мне реализовать правильный метод получения и установки для элемента innerClass OuterClass?

Заранее спасибо!

Ответы [ 5 ]

26 голосов
/ 11 мая 2009

Синтаксис не будет отличаться. Просто ...

public InnerClass InnerClass
{
    get { return innerClass; }
    set { innerClass = value; }
}

Кстати, если вы используете C # в .NET 3.5, вы можете использовать функцию автоматического создания свойств, если все, что у вас есть, - это простое свойство, которое просто читает и записывает в резервное хранилище (как у вас было выше). Синтаксис похож на синтаксис абстрактного свойства:

public InnerClass InnerClass { get; set; }

Это автоматически генерирует закрытый элемент для хранения, затем читает из него в get и записывает в него в set.

21 голосов
/ 11 мая 2009

Самый элегантный способ сделать это - использовать неявные методы получения и установки:

class InnerClass
{
  public int a{ get; set; }
  public int b{ get; set; }
}

class OuterClass
{
  public InnerClass innerClass{ get; set; }
}

Это то же самое, что и:

class InnerClass
{
    private int _a;
    public int a
    {
        get
        {
            return _a;
        }
        set
        {
            _a = value;
        }
    }

    private int _b;
    public int b
    {
        get
        {
            return _b;
        }
        set
        {
            _b = value;
        }
    }
}

class OuterClass
{
    private InnerClass _innerClass;
    public InnerClass innerClass
    {
        get
        {
            return _innerClass;
        }
        set
        {
            _innerClass = value;
        }
    }
}

Эти два определения неявно совпадают - за исключением нескольких нажатий клавиш. В первом примере компилятор реализует необходимые закрытые поля за кулисами, поэтому вам не нужно это делать. Второй, однако, дает вам больше контроля над тем, что происходит.

2 голосов
/ 11 мая 2009
public InnerClass InnerClass
    {
        get
        {
             return innerClass;
        }
        set
        {
             innerClass = value;
        }
     }
0 голосов
/ 11 мая 2009

Если вы имеете в виду доступ к внутренним членам класса без раскрытия самого внутреннего класса, вы можете использовать следующий код. Если вы просто хотите выставить this.innerClass, нет никакой разницы в том, как вы выставляете поля InnerClass.

class OuterClass
{
    private InnerClass innerClass

    public int M_A
    {
        get
        {
            if (this.innerClass != null)
            {
                 return this.innerClass.M_A;
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
        set
        {
            if (this.innerClass != null)
            {
                 this.innerClass.M_A = value;
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
    }
}
0 голосов
/ 11 мая 2009

Это зависит от того, как должен работать внутренний класс. Внешнему классу может потребоваться «владеть» внутренним классом, в этом случае:

public InnerClass InnerClass{
  get{ return innerClass; }
  set{ innerClass.CopyFrom(value); /* Pseudo method call */ }
}

Делая это таким образом, вы не позволяете внешнему коду манипулировать экземпляром, если это явно не выполняется через OuterClass.

...