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