C# - 模仿构造函数的函数

时间:2016-06-21 09:07:05

标签: c# unity3d

由于Unity构建脚本/预制件的方式,我遇到了问题。

因为我们必须通过Instantiate(Prefab)实例化脚本,所以我无法运行脚本的构造函数,包括重载。

实施例

class A()
class B(string s1) : base()                   //Inherits from A
class C(string s1, string s2) : base(string)  //Inherits from B

现在我刚刚将构造函数更改为" Init"方法所以;

void Init() {...}                  //Replaces class A constructor.
void Init(string s1){Init();...}   //Replaces class B constructor. This calls Init()
void Init(string s1, string s2){Init(s1);...}  //Replaces class C constructor. This calls Init(string)

显然这并不理想,好像我想要初始化C类我冒着运行错误的Init函数的风险,因为我知道没有办法在没有相同签名的情况下重载/覆盖函数。

有没有办法模仿构造函数的工作方式?我可以采用任何特定模式来阻止这种情况发生,因为这种设计显然不是理想的。

1 个答案:

答案 0 :(得分:0)

如果你的类派生自MonoBehaviour,那么可以像你一样使用某种init函数,或者如果适合你可以使用Awake/Start。如果你的课程并非来自MonoBehaviour("纯c#class")那么你可以使用构造函数。

此外,如果只需要将脚本添加到现有对象,则可以使用AddComponent添加脚本。

我不太了解你的Init功能结构。那些是相互呼唤的(从下到上)?

你基本上可以使你的init函数像构造函数。

public void Init(){...}    // = empty constructor

public void Init(int a, int b){...}    // = constructor with two int parameters

public void Init(int c, string d){...}    // = constructor with an int and a string parameter

您可以使用注释,以便在某处使用该函数时获得信息文本,以便了解哪个函数可以执行哪些操作。 (在函数上方使用///三次斜杠作为函数摘要。)

修改
如何打电话的小例子:

GameObject obj_A = (GameObject) Instantiate(prefab_A , ..., ...);
ClassA cls_A = obj_A.GetComponent<ClassA>();
cls_A.Init(5, "hello");

GameObject obj_B = (GameObject) Instantiate(prefab_B , ..., ...);
ClassB cls_B = obj_B.GetComponent<ClassB>();
cls_B.Init();

GameObject obj_C = (GameObject) Instantiate(prefab_C , ..., ...);
ClassC cls_C = obj_C.GetComponent<ClassC>();
cls_C.Init(1, "bye");