Getter и setter для класса в классе С#

Предполагая, что у нас есть класс 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
}

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

Спасибо заранее!

Ответы

Ответ 1

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

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

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

public InnerClass InnerClass { get; set; }

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

Ответ 2

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

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;
        }
    }
}

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Если вы имеете в виду доступ к внутренним членам класса, не подвергая себя внутреннему классу, вы можете использовать следующий код. Если вы просто хотите открыть 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();
            }
        }
    }
}