중첩 클래스에서 포함하는 클래스의 필드에 액세스하는 가장 좋은 방법은 무엇입니까?
양식에 드롭 다운이 있고이 클래스 안에 또 다른 중첩 클래스가 있다고 가정합니다. 이제 중첩 된 클래스에서이 드롭 다운에 액세스하는 가장 좋은 방법은 무엇입니까?
Java와 달리 중첩 클래스는 특별한 "내부 클래스"가 아니므로 참조를 전달해야합니다. Raymond Chen은 여기에 차이점을 설명하는 예가 있습니다. C # 중첩 클래스는 Java 내부 클래스가 아니라 C ++ 중첩 클래스와 같습니다 .
다음은 나중에 참조 할 수 있도록 중첩 클래스의 생성자가 외부 클래스의 인스턴스에 전달되는 예입니다.
// C#
class OuterClass
{
string s;
// ...
class InnerClass
{
OuterClass o_;
public InnerClass(OuterClass o) { o_ = o; }
public string GetOuterString() { return o_.s; }
}
void SomeFunction() {
InnerClass i = new InnerClass(this);
i.GetOuterString();
}
}
InnerClass는 OuterClass의 " s
"에 액세스 할 수 있으며 위에서 링크 한대로 Raymond의 코드를 수정하지 않았습니다. 따라서 " string s;
"는 private
다른 액세스 권한이 지정되지 않았기 때문 이라는 것을 기억하십시오 .
중첩 유형은 Java의 내부 클래스와 다릅니다. 포함 유형의 고유 인스턴스가 없습니다. (이들은 Java의 정적 중첩 클래스와 비슷합니다.) 두 가지 차이점이있는 효과적으로 분리 된 클래스입니다.
- 포함하는 형식이 일반적인 경우, 중첩 된 유형은 효과적으로 예는, 포함하는 형식으로 매개 변수화되는
Outer<int>.Nested
동일하지 않습니다Outer<string>.Nested
. - 중첩 된 유형은 포함하는 유형의 개인 멤버에 액세스 할 수 있습니다.
Java와 달리 C #에는 둘러싸는 클래스의 인스턴스에 대한 암시 적 참조가 없습니다.
이러한 참조를 중첩 된 클래스에 전달해야합니다. 이를 수행하는 일반적인 방법은 중첩 된 클래스의 생성자를 사용하는 것입니다.
public partial class Form1 : Form
{
private Nested m_Nested;
public Form1()
{
InitializeComponent();
m_Nested = new Nested(this);
m_Nested.Test();
}
private class Nested
{
private Form1 m_Parent;
protected Form1 Parent
{
get
{
return m_Parent;
}
}
public Nested(Form1 parent)
{
m_Parent = parent;
}
public void Test()
{
this.Parent.textBox1.Text = "Testing access to parent Form's control";
}
}
}
정적 멤버
지금까지 아무도 언급하지 않았기 때문에 : 상황에 따라 멤버 변수가 static 일 수있는 경우 다음과 같은 방법으로 간단히 액세스 할 수 있습니다.
class OuterClass
{
private static int memberVar;
class NestedClass
{
void SomeFunction() { OuterClass.memberVar = 42; }
}
}
사이드 노트 : 외부 클래스의 개인 멤버에 액세스하는 중첩 클래스의 주어진 기능을 설명하기 위해 memberVar
의도적으로 (그리고 중복 적으로) 표시 private
했습니다.
주의 / 고려하십시오
어떤 상황 에서는 이것이 액세스를 얻는 가장 쉬운 방법 / 해결 방법 일 수 있지만 ...
정적은 또한 변수가 모든 인스턴스 객체에서 공유되며 모든 단점 / 결과 (스레드 안전성 등)가 있음을 의미합니다.
Static also means, that this will obviously not work if you have more than one instance of the parent's class and the variable should hold an individual value for each instance
So in most cases you might wanna go with a different approach ...
Passing a Reference
As most people have suggested (and because it is also the most correct answer), here an example of passing a reference to the outer class' instance.
class OuterClass
{
private int memberVar;
private NestedClass n;
OuterClass() { n = new NestedClass(this); }
class NestedClass
{
private OuterClass parent;
NestedClass(OuterClass p) { parent = p; }
SomeFunction() { parent.memberVar = 42; }
}
}
One other method, which is useful under certain circumstances, is to derive the nested class off of the outer class. Like so:
class Outer()
{
protected int outerVar;
class Nested() : Outer
{
//can access outerVar here, without the need for a
// reference variable (or the associated dot notation).
}
}
I have used this technique especially in the context of Structured Unit Tests. (This may not apply to the OP's particular question, but it can be helpful with nested classes in general, as in the case of this "duplicate" question: " Can i access outer class objects in inner class ")
Correct me if I am wrong, you are trying to process the outer control from inner class hence you ran into this. A better way of doing this would be to handle affairs in a event driven fashion. Use an Observer pattern, Register a listener on the outer control (your nested/inner class will be the listener). Makes life simpler. I am afraid that this is not the answer you were expecting!
You could pass the enclosing class as a parameter to the nested class constructor, like this:
private NestedClass _nestedClass;
public ParentClass()
{
_nestedClass = new NestedClass(this);
}
Nested classes are generally not recommended and should be private and/or internal. They are, in my opinion, useful sometimes though.
send the master class as an constructor parameter to the nested (inner) class.
ReferenceURL : https://stackoverflow.com/questions/185124/whats-the-best-way-of-accessing-field-in-the-enclosing-class-from-the-nested-cl
'IT박스' 카테고리의 다른 글
Newtonsoft.Json.Linq.JArray를 문자열 배열로 C # (0) | 2020.12.15 |
---|---|
사용자 영역 프록시 시작 오류 : 0.0.0.0:80에 대한 바인딩 : 예기치 않은 오류 권한이 거부되었습니다. (0) | 2020.12.15 |
모든 어셈블리에서 유형 찾기 (0) | 2020.12.14 |
CSS3 열-강제 중단 / 분할 요소? (0) | 2020.12.14 |
symfony2 및 doctrine을 사용하여 기존 데이터베이스에서 단일 엔티티 생성 (0) | 2020.12.14 |