我正在构建一个需要Scriptable对象的Unity扩展。使用Scriptable对象时,用户必须使用ScriptableObject.createInstance()实例化一个继承自ScriptableObject的类。因此,如果我们需要向实例提供更多信息以完全初始化它,我们将被迫使用两步初始化模型。
我想了解使用2个步骤初始化对象时的最佳实践(使用构造函数创建和使用Init()方法初始化)。
我发现的主要问题是,由于你需要在派生的clases中专门化Init()方法以适应特定对象的初始化,你会得到越来越多的Init()方法,因为签名因参数不同而不匹配使用
我遇到过这个问题的两个解决方案:
1)隐藏父方法并为未完全实例化特殊类型的Init()方法抛出异常。
2)使用一个只暴露有效的Initialization方法的包装类。
这些对我来说都很麻烦。这就是为什么我想听听其他人如何克服这个问题。
澄清问题的一个例子:
public class Class1 : ScriptableObject
{
public virtual void Init()
{
Debug.Log("Class1::Init()");
}
}
public class Class2 : Class1
{
int myParameter;
public virtual void Init(int parameter)
{
Debug.Log("Class3::Init()");
}
}
//I could now do something like this. And the Class2 object
//Would contain an invalid state because myParameter wasn't initialized
Class2 c= ScritableObject.CreateInstance<Class2>();
c.Init();