有一些具有相同行为能力的数据管理器,为了统一规范这些行为,需要使用接口。
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类型了。