假设我有一个表单中的下拉菜单,并且该类中还有另一个嵌套类。那么从嵌套类中访问此下拉菜单的最佳方法是什么?
假设我有一个表单中的下拉菜单,并且该类中还有另一个嵌套类。那么从嵌套类中访问此下拉菜单的最佳方法是什么?
与Java不同,嵌套类并非特殊的“内部类”,因此您需要传递引用。Raymond Chen在这里描述了其中的区别:C#嵌套类类似于C++嵌套类,而不是Java内部类。
以下是一个示例,其中嵌套类的构造函数接收外部类的实例以供稍后引用。
// 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
不同。C#中与Java不同的是,没有对封闭类实例的隐式引用。
你需要将这样的引用传递给嵌套类。一种典型的方法是通过嵌套类的构造函数来实现。
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";
}
}
}
Form1 form = new Form1(); new Nested(form);
是合法的)。 - Stevens Miller因为迄今为止没有人提到过:根据您的情况,如果成员变量也可以是静态的,则可以通过以下方式简单地访问它。
class OuterClass
{
private static int memberVar;
class NestedClass
{
void SomeFunction() { OuterClass.memberVar = 42; }
}
}
附注:我有意(且多余地)将memberVar
标记为private
,以说明嵌套类可以访问其外部类的私有成员变量。
在某些情况下,这可能是获取访问权限最简单的方法/解决方法之一,但是......
静态也意味着该变量将在所有实例对象之间共享,并带有所有相关的缺点/后果(线程安全性等)
静态还意味着如果您有父类的多个实例,并且该变量应为每个实例保持不同的值,则此方法显然行不通
因此,在大多数情况下,您可能希望采用不同的方法......
正如大多数人建议的那样(并且因为它也是最正确的答案),这里是传递外部类实例引用的示例。
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; }
}
}
另一种在特定情况下有用的方法是将嵌套类派生自外部类。像这样:
class Outer()
{
protected int outerVar;
class Nested() : Outer
{
//can access outerVar here, without the need for a
// reference variable (or the associated dot notation).
}
}
我在特定情境下尤其使用了这种技术,即结构化单元测试。(虽然这可能不适用于提问者的具体问题,但它通常可用于嵌套类的情况,比如这个“重复”的问题:“我可以在内部类中访问外部类对象吗?”)
Outer
实例并且想要一个对应于你现有 Outer
实例的 Nested
实例,我认为这不起作用。 - Sam如果我理解错了,请纠正我,您正在尝试从内部类处理外部控件,因此遇到了这个问题。更好的方法是以事件驱动的方式处理事务。使用观察者模式,在外部控件上注册一个监听器(您的嵌套/内部类将成为监听器)。这样会使生活更简单。恐怕这不是您期望的答案!
private NestedClass _nestedClass;
public ParentClass()
{
_nestedClass = new NestedClass(this);
}
嵌套类通常不建议使用,应该是私有的和/或内部的。但在我看来,它们有时是有用的。
上面有一个好的回答,但我想写点东西。
c# 嵌套类默认为 private
对于包含类是私有的如果您要使用它必须将其设置为 public