三、定义主从实体基类

简介:

三、定义主从实体基类

 

定义主从实体基类的原因是我希望在类的定义时,可以很明确的了解类之间的主从关系。

 

 

 

3.1定义主表基类

定义PrimaryDataEntityBase

 
  1. /// <summary>  
  2. /// 描述主从表的主表的数据实体  
  3. /// </summary>  
  4. /// <typeparam name="ID">主表实体的主键ID</typeparam>  
  5. /// <typeparam name="P">主表</typeparam>  
  6. /// <typeparam name="F">从表</typeparam>  
  7. public abstract class PrimaryDataEntityBase<ID, P, F> : EntityBase<P, ID>  
  8.     where P : PrimaryDataEntityBase<ID, P, F>  
  9.     where F : ForeignDataEntityBase<ID, P, F>  
  10. {  
  11.     /// <summary>  
  12.     /// PrimaryDataEntityBase的默认构造函数  
  13.     /// </summary>  
  14.     public PrimaryDataEntityBase()  
  15.     {  
  16.     }  
  17.     /// <summary>  
  18.     /// 按table的第一行数据进行属性的初始化  
  19.     /// </summary>  
  20.     /// <param name="table"></param>  
  21.     public PrimaryDataEntityBase(System.Data.DataTable table)  
  22.         : this(table, 0)  
  23.     {  
  24.     }  
  25.     /// <summary>  
  26.     /// 按table的指定行数据进行属性的初始化  
  27.     /// </summary>  
  28.     /// <param name="table"></param>  
  29.     /// <param name="indexRow"></param>  
  30.     public PrimaryDataEntityBase(System.Data.DataTable tableint indexRow)  
  31.         : base(table, indexRow)  
  32.     {  
  33.     }  
  34.     /// <summary>  
  35.     /// 装载当前从表的详细项  
  36.     /// </summary>  
  37.     protected abstract List<F> LoadDetailedItems();  
  38.     /// <summary>  
  39.     /// 存放外键表的数据项目的集合  
  40.     /// </summary>  
  41.     protected List<F> items = new List<F>();  
  42.     /// <summary>  
  43.     /// 获取外键表数据的集合  
  44.     /// </summary>  
  45.     public List<F> DetailedItems  
  46.     {  
  47.         get  
  48.         {  
  49.             return LoadDetailedItems();  
  50.         }  
  51.     }  
  52.     /// <summary>  
  53.     /// 返回外键表的数据项目数量  
  54.     /// </summary>  
  55.     public int DetailedItemCount  
  56.     {  
  57.         get  
  58.         {  
  59.             return items.Count;  
  60.         }  
  61.     }  
  62.     /// <summary>  
  63.     /// 将一个外键实体加入集合  
  64.     /// </summary>  
  65.     /// <param name="item"></param>  
  66.     /// <returns></returns>  
  67.     public abstract void Add(F item);  
  68.     /// <summary>  
  69.     /// 从集合中移除一个外键实体  
  70.     /// </summary>  
  71.     /// <param name="item"></param>  
  72.     public abstract void Remove(F item);  
  73.     /// <summary>  
  74.     /// 从集合中移除一个外键实体  
  75.     /// </summary>  
  76.     /// <param name="index"></param>  
  77.     public abstract void RemoveAt(int index);  
  78.     /// <summary>  
  79.     /// 返回或设置匹配索引的订单详细项  
  80.     /// </summary>  
  81.     /// <param name="index"></param>  
  82.     /// <returns></returns>  
  83.     public abstract F this[int index]  
  84.     {  
  85.         set;  
  86.         get;  
  87.     }  

3.2定义从表基类

定义ForeignDataEntityBase

 
  1. /// <summary>  
  2. /// 描述主从表的从表的数据实体  
  3. /// </summary>  
  4. /// <typeparam name="ID">从表实体的主键ID</typeparam>  
  5. /// <typeparam name="P">主表</typeparam>  
  6. /// <typeparam name="F">从表</typeparam>  
  7. public abstract class ForeignDataEntityBase<ID, P, F> : EntityBase<F, ID>  
  8.     where P : PrimaryDataEntityBase<ID, P, F>  
  9.     where F : ForeignDataEntityBase<ID, P, F>  
  10. {  
  11.     /// <summary>  
  12.     /// ForeignDataEntityBase的默认构造函数  
  13.     /// </summary>  
  14.     public ForeignDataEntityBase()  
  15.     {  
  16.     }  
  17.     /// <summary>  
  18.     /// 按table的第一行数据进行属性的初始化  
  19.     /// </summary>  
  20.     /// <param name="table"></param>  
  21.     public ForeignDataEntityBase(System.Data.DataTable table)  
  22.         : this(table, 0)  
  23.     {  
  24.     }  
  25.     /// <summary>  
  26.     /// 按table的指定行数据进行属性的初始化  
  27.     /// </summary>  
  28.     /// <param name="table"></param>  
  29.     /// <param name="indexRow"></param>  
  30.     public ForeignDataEntityBase(System.Data.DataTable tableint indexRow)  
  31.         : base(table, indexRow)  
  32.     {  
  33.     }  
  34.     /// <summary>  
  35.     /// 对应主键实体  
  36.     /// </summary>  
  37.     [System.ComponentModel.DataObjectField(falsefalsefalse)]  
  38.     public P RelationOrder  
  39.     {  
  40.         set;  
  41.         get;  
  42.     }  

3.3使用主从表基类

 
  1. /// <summary>  
  2. /// 客户委托单  
  3. /// </summary>  
  4. [System.ComponentModel.DataObject(true)]  
  5. public class BusinessOrder : LogisticsOrderBase<BusinessOrder, BusinessOrderItem>  
  6. {  
  7. }  
  8. /// <summary>  
  9. /// 委托单详细  
  10. /// </summary>  
  11. [System.ComponentModel.DataObject(true)]  
  12. public class BusinessOrderItem : DetailedItemBase<BusinessOrder, BusinessOrderItem>  
  13. {  

现在我们的类在定义的时候,就可以非常明确的描述了主从实体的关系,并拥有了数据自动属性装载的能力。



本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/805772


相关文章
|
2月前
|
存储 C++
c++类和对象一对象特性一成员变量和成员函数分开存储
c++类和对象一对象特性一成员变量和成员函数分开存储
14 0
|
5月前
|
C++
[C++] 多个模块实时公用一个类中的成员变量
[C++] 多个模块实时公用一个类中的成员变量
87 1
|
9月前
|
Java
类之间的比较
类之间的比较
35 0
|
11月前
|
编译器 C语言 C++
C++ 之什么是类 & 对象的关系?
C++ 之什么是类 & 对象的关系?
【C++之多层继承】成员在各类的范围内的访问属性
【C++之多层继承】成员在各类的范围内的访问属性
|
缓存 IDE API
C#反射与特性(五):主类型成员操作
C#反射与特性(五):主类型成员操作
338 0
C#反射与特性(五):主类型成员操作
接口vs抽象类、继承vs组合,他们之间有啥关系
接口vs抽象类、继承vs组合,他们之间有啥关系
普通类,抽象类和接口之间的区别
普通类,抽象类和接口之间的区别
|
设计模式 存储 前端开发
层次结构及对象的定义|学习笔记
快速学习层次结构及对象的定义
100 0
|
存储 Java
类与类的关系
## 继承关系 1.子类想要继承父类,通过extends关键字来实现 2.子类继承了父类,可以调用父类中(public protected)的属性和方法 2.1构造方法严格意义来说 不算做子类继承过来 只是单纯的在子类调用构造方法时默认调用父类的构造方法 2.2程序块严格意义来说 不算做子类继承过来(子类自己调用不到 没名字) 程序块子类不能直接调用 子类执行构造方法之前 默认调用了父类的构造方法 父类构造方法之前自动执行父类的块 3.子类除了能继承父类的属性和方法外,子类还可以添加自己独有的成员(属性 方法)
92 0