如何从类中传递类的实例

本文关键字:实例 | 更新日期: 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对象的上下文中(因此出现错误)。