我正在构建一个需要 Scriptable 对象的 Unity 扩展。使用 Scriptable 对象时,用户必须使用 ScriptableObject.createInstance() 实例化从 ScriptableObject 继承的类。因此,如果我们需要向实例提供更多信息以完全初始化它,我们就不得不使用两步初始化模型。
我想知道使用 2 个步骤(使用构造函数创建和使用 Init() 方法初始化)初始化对象时的最佳实践。
我发现的主要问题是,由于您需要在派生类中专门化 Init() 方法以适应对专门化对象的初始化,因此您会获得越来越多的 Init() 方法,因为由于使用的参数不同,签名不匹配。
我遇到了这个问题的两种解决方案:
1) 隐藏父方法并为未完全实例化专用类型的 Init() 方法抛出异常。
2) 使用仅公开有效初始化方法的包装类。
这两个对我来说似乎都很麻烦。这就是为什么我想听听其他人是如何克服这个问题的。
澄清问题的一个例子:
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();