【问题标题】:Generic base class to define custom data用于定义自定义数据的通用基类
【发布时间】:2014-04-12 02:15:17
【问题描述】:

我想在我的某些 MonoBehaviour 类中添加一个 Data 对象。

所以,我创建了一个这样的抽象类:

public abstract class DataMonoBehaviour<T> : MonoBehaviour 
    where T : BaseData, new()
{
    protected T Data;

    protected DataMonoBehaviour() 
    {
        Data = new T();
    }

    protected virtual T GetData()
    {
        if (Data == null)
            return default(T);

        return Data;
    }
}

我的 Data 对象也有一个类(它可能是一个接口):

public class BaseData { }

还有一些派生的 Data 类,上面有属性:

public class DataA : BaseData { Property1, Property2 }
public class DataB : BaseData { Property1 }

所以现在我可以创建与 Data 对象关联的 Monobehaviours:

public class MonobehaviourA : DataMonoBehaviour<DataA> { }
public class MonobehaviourB : DataMonoBehaviour<DataB> { }

这样做是个好习惯吗?

如果我想从列表中获取所有继承自 DataMonoBehaviour(无论 T 的类型)的 MonoBehaviour。我是否必须为 DataMonoBehaviour 创建一个基类?

那么如何将退货商品转换回DataMonoBehaviour,这样我就可以这样做了:

((Cast to DataMonoBehaviour<T>)item).GetData();

返回与 DataMonoBehaviour 关联的我的 Data 对象

我不知道是否可以这样做。如果没有,有哪些可能的解决方案?

【问题讨论】:

  • 我有一些话要说。在我看来,BaseClass(如您的 BaseData)应该始终是抽象的。这就是我所期望的。我也不会命名没有抽象或名称的抽象类(如您的 DataMonoBehaviour),因为它只是令人困惑。
  • 您能告诉我们您将在什么环境中使用它吗?目前我看不出这有什么用,您不妨立即使用 T,您的 DataMonoBehaviour 没有任何用途(也就是说,没有看到您的其余代码)
  • @Kenneth :这是一个 Unity 项目en.wikipedia.org/wiki/Unity3D。在 Unity 中,您可以将脚本(继承自 MonoBehaviour 的类)添加到 GameObject。我想序列化我的 MonoBehaviour 的相关数据,但 MonoBehaviour 无法实现 ISerializable 接口。这就是为什么我想在我的一些 MonoBehaviour 中添加一个自定义数据类。这个数据类将是可序列化的

标签: c# generics base-class


【解决方案1】:

这样做是个好习惯吗?

我认为这是解决问题的一种可能方法。我也会这样做。

如果想从列表中获取我所有继承自 DataMonoBehaviour(无论 T 的类型)的 MonoBehaviour。我是否必须为 DataMonoBehaviour 创建一个基类?

我个人会使用接口。然后你可以做一些这样的想法......

public interface IDataMonoBehaviour
{
    BaseData GetData();
}

并遍历列表...

foreach(var monoBehaviour in monoBehaviourList)
{
    var behaviour = myBehaviour as IDataMonoBehaviour;
    if (behaviour != null)
    {
       // inherites from IDataMonoBehaviour 
    }
}

那么我怎样才能将退货项目转换回 DataMonoBehaviour 以便我可以做到这一点......

接下来呢?

((IDataMonoBehaviour)item).GetData();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多