关于使用泛型接口碰到的一个结构相关的问题

有一些具有相同行为能力的数据管理器,为了统一规范这些行为,需要使用接口。

public interface IDataManager:
{
    IData Add();
    IList<IData> FindAll();
}

public interface IData:
{
}

写一个具体的数据管理器,实现这个接口:

public class MyDataManager:IDataManager
{
    MyData Add()
    {
        return...
    }
    IList<MyData> FindAdd()
    {
        return...
    }
}

public class MyData:IData
{

}

因为每个数据管理器必定唯一关联一个对应的数据类,所以数据管理器接口应该做成一个泛型接口,用以约束,保证以后的每个数据管理器都应该对应一个自己的数据类型。

public interface IDataManager<T> where T:IData
{
    T Add();
    IList<T> FindAll();
}

public interface IData:
{
}

public class MyDataManager : IDataManager<MyData>
{
    MyData Add()
    {
        return...
    }
    IList<MyData> FindAll()
    {
        return...
    }
}

public class MyData:IData
{
}

目前从接口设计角度看,一点问题都没有,碰到的问题是在使用数据管理器的时候。

界面需要做成一个通用界面,它可以动态抓取都有哪些数据管理器,使用通用抽象数据对象实现界面的显示。

public class MyPanel
{
    void Main()
    {
        MyDataManager myDataManager = new MyDataManager();
        IDataManager<IData> dataManager = myDataManager as IDataManager<IData>;
    }
}

写界面的时候,希望的是这样的代码,拿到的数据管理器都是抽象的,但是这么写拿到的一定是空对象,因为MyDataManager对应的数据类型是MyData,而我们as的时候,用的是IData。

用IData,对象实例化会出问题;用MyData,与初衷不符。

一直以来对数据和视图的使用都是视图直接调用,从视图角度出发考虑导致这个矛盾的产生。

其实应该以接口为起点考虑问题,以面向对象的思想考虑,这么设计出来的泛型接口一点问题都没有,但是数据到了视图层还是具体数据该怎么办呢,很简单,把所有数据重新处理成IData即可,这样视图层拿到的所有数据都是IData类型了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值