如何从类中传递类的实例
本文关键字:实例 | 更新日期: 2023-09-27 18:15:06
我想知道一些可以在c++中实现的东西,但我想在c#中完成。
如何从包含代码的类内部传递"指针"到类,允许我以Foo.Bar()的形式编写代码?
namespace Example
{
public class Foo
{
MainClass MainClass;
public void Bar()
{
var somethingElse = MainClass.A.SomethingElse;
var somethingDifferent = MainClass.B.SomethingDifferent;
}
}
public class MainClass
{
public string Something;
public SubClassA A = new SubClassA(this); // <<-- not valid in c#
public SubClassB B = new SubClassB(this); // <<-- not valid in c#
}
public class SubClassA
{
private MainClass _MainClass;
public SubClassA(MainClass mainClass)
{
_MainClass = mainClass;
}
public string SomethingElse {
get {
return _MainClass.Something + " Else";
}
}
}
public class SubClassB
{
private MainClass _MainClass;
public SubClassB(MainClass mainClass)
{
_MainClass = mainClass;
}
public string SomethingDifferent
{
get
{
return _MainClass.Something + " Different";
}
}
}
}
我应该声明,我知道我可以用一百万种方法重构我的代码来实现一个可行的结果,但是我有一个特定的问题我希望回答!:)
谢谢
您所需要做的就是将初始化表达式从字段声明中移到构造函数中:
public class MainClass
{
public string Something;
public SubClassA A;
public SubClassB B;
public MainClass()
{
A = new SubClassA(this);
B = new SubClassB(this);
}
}
注意:
- 请停止使用公共字段。他们让我伤心,这是一个周五的下午,我应该高兴的。
- 在施工期间"泄漏"
this
指针可能是危险的。如果您正在调用的对象(本例中是构造函数)回调到对象,那么当您还没有完成初始化时,它将正在运行代码。这有点像在构造函数中调用虚方法——它可以工作,但它使代码变得脆弱。 - 子类。你一直在用这个词。我不认为这是你想的那个意思。
- 你从来没有初始化
Foo.MainClass
,所以你的Bar()
方法将失败与NullReferenceException
在MainClass
中,您需要在MainClass
构造函数中初始化SubClassA
A和SubClassB
B(其中this
将具有有效引用)。当前初始化这些成员的地方是在创建的MainClass
对象的上下文中(因此出现错误)。