【问题标题】:Pass owner reference to class constructor将所有者引用传递给类构造函数
【发布时间】:2018-02-25 05:12:27
【问题描述】:

很简单的问题: 在 c#(在 Unity 中)中,我从附加到游戏对象的 Monobehaviour 类创建了一个新的自定义类:

CustomClass test1 = new CustomClass(t1, t2, 0.5f);

我想让这个类实例知道它的创建者是谁——它是一个协程,它应该检查它的父级是否被销毁。我当然可以这样传:

CustomClass test1 = new CustomClass(this, t1, t2, 0.5f);
///
CustomClass(MonoBehaviour creator, string t, string t2, float a);

但是,有没有更优雅(=自动)的方式来做到这一点?我知道静态函数的以下方法:

public static void Test(this MonoBehaviour behaviour, float a);
///
this.Test(0.5f);

类构造函数有类似的东西吗?

【问题讨论】:

  • 您可以向MonoBehavior 添加一个扩展方法,该方法调用构造函数并传递this 实例..
  • 我不认为一个类有一种“优雅”的方式来引用它的所有者,因为这种方式违背了将事物封装在类中的概念。也许在所有者的析构函数中,你可以让它告诉协程停止执行,或者将它传递给不同的所有者,或者你需要做的任何事情。

标签: c# class unity3d constructor instance


【解决方案1】:

这必须完成manually。确实 没有 方法可以自动传递该引用,但是有一种方法可以做到这一点,而无需通过函数或构造函数传递它。

您可以使用static 字典来简化此操作。不过,每次创建 CustomClass 的新实例时,都必须将 CustomClassMonoBehaviour 添加到字典中。

CustomClass 函数中,您可以拥有一个函数,通过将CustomClass 实例传递给static 字典,从字典中检索MonoBehaviour

创建CustomClass 类的新实例的类示例:

public class TestMono: MonoBehaviour
{
    public static Dictionary<CustomClass, MonoBehaviour> classToMonoBehaviour;

    // Use this for initialization
    void Awake()
    {
        classToMonoBehaviour = new Dictionary<CustomClass, MonoBehaviour>();

        //Create and add class to the dictionary
        CustomClass cclas = new CustomClass();
        classToMonoBehaviour.Add(cclas, this);
    }
}

需要访问创建它的MonoBehaviourCustomClass 类:

public class CustomClass
{
    public CustomClass(){}

    public MonoBehaviour getCreator()
    {
        //Access MonoBehaviour from the dictionary
        MonoBehaviour result;
        TestMono.classToMonoBehaviour.TryGetValue(this, out result);
        return result;
    }
}

【讨论】:

  • 感谢您的完整回答,没办法 - 没问题。不过,我必须指出,您的建议没有什么意义,因为定义、声明和存储特殊字典比仅将“this”作为参数传递要长得多。
  • 是的,没错。仅建议让您知道您甚至不需要将MonoBehaviour 传递给另一个班级。请记住,字典的声明只进行一次。你们彼此做的就是将它添加到字典中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2014-06-04
  • 2018-05-09
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多