c# - 初始化从单一行为派生的对象的最佳方法是什么?

标签 c# unity3d

我们不能在Monobehavior的派生类中使用构造函数,所以我们定义了“Initialze”方法来模拟构造函数,定义如下:

public class Animal : Monobehavior
{
    public void Initialize(string animalName)
    {
        // initialze animal
    }
}

然后是狗类,它有不同的初始化参数列表:

public class Dog : Animal 
{
    // Cannot override because different parameter list
    public void Initialize(string animalName, Bone favoriteBone)
    {
        base.Initialize(animalName);
        // initialze dog
    }
}

然后,我们像这样创建动物对象:

var animalInstance = Instantiate(animalPrefab);
animalInstance.Initialize("animal name");

然后我们像这样创建狗对象:

var dogInstance = Instantiate(dogPrefab);
dogInstance.Initialize("dog name", new Bone());

问题来了,我们仍然可以在没有 Bone 参数的情况下调用“dogInstance.Initialize("dog name")”,这与 C# 构造函数不同,如果有一天我喝醉了并写下了愚蠢的代码(或者其他人来写它),这是一个很大的麻烦。

那么,有没有最好的方法来初始化从 monobehavior 派生的对象?

最佳答案

您可以分支出基本动物的实例化。您可以将 Animal 类设为 abstract 基类(其 Initialize(string) 受到 protected) .

您可以从 Animal 派生 SimpleAnimal,当您想要实例化一些基本动物时将使用它。然后你将有 Animal 派生自和 SimpleAnimal 实例化。

例如喜欢

public abstract class Animal : MonoBehaviour
{
    public string Name { get; private set; }

    protected void Initialize(string animalName)
    {
        Name = animalName;
    }
}

public class Dog : Animal
{
    public void Initialize(string animalName, Bone favoriteBone)
    {
        base.Initialize(animalName);

        // initialze dog
    }
}

public class SimpleAnimal : Animal
{
    public new void Initialize(string animalName)
    {
        base.Initialize(animalName);
    }
}

关于c# - 初始化从单一行为派生的对象的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63933268/

相关文章:

c# - 保存只读结构化数据的最佳 "place"是什么?

c# - 如何查找列表的元素是否在另一个列表中?

c# - 如何在我需要时打开门

android - Android和Unity之间如何通信?

c# - 如何清除 LineRenderer 路径以重绘线条?

c# - ASP.Net Identity 如何设置目标数据库?

c# - 在 winforms 中嵌入用户可自定义的 richtext 或 html

c# - 使用jquery迭代表并获取asp.net core中的值

c# - 返回 null 的 Unity c# 脚本引用

c# - 比较 float 的总和