用于定义自定义数据的通用基类

时间:2014-03-08 21:36:42

标签: c# generics base-class

我想在我的一些MonoBehaviour课程中添加 数据 对象。

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

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;
    }
}

我还有一个用于 数据 对象的课程(可能是一个界面):

public class BaseData { }

一些派生了 数据 的类,其中包含属性:

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

现在我可以创建与 数据 对象相关联的Monobehaviours:

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

这样做是好的做法吗?

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

然后我如何将退货项目转换回DataMonoBehaviour,以便我可以这样做:

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

返回与DataMonoBehaviour相关联的 数据 对象

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

1 个答案:

答案 0 :(得分:0)

  

这样做是否是一种好习惯?

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

  

如果想从列表中获取从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();