博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一回 要想知道为什么抽象出基类,应该先对基类有一个比较明确的认识
阅读量:7258 次
发布时间:2019-06-29

本文共 4558 字,大约阅读时间需要 15 分钟。

    基类,即基础类型,也称为父类,祖宗类等,它一般会以抽象类(abstract class)的形式体现出来,它会包括一些具有共性的,一般性的信息(属性和方法等),它在描述一类对象时,经常会被抽象出来,如一个小猫,一只小狗,很容易会让你抽象出一个animal来,这是正常的,是符合面向对象人生观的,呵呵。

      而在实际项目开发中,这种例子也不少,可以说到处都可以看到基类的身影,有人说,请不要使用继承,因为它为使你的程序很糟糕,依赖太多不好,但我要说的是,如果你的程序是一个关系复杂,面向对象的,那你的程序在某些地方必须要去继承(抽象出基类),有时,我们会说,那什么时候去使用基类,我们应该如何去衡量呢?事实上这种衡量是没有意义的,是应试的,就像我国的教育,我是很不喜欢,永远都是应付考试,对于基类这东西,你需要它时,就使用它,不要管什么原则,当你需要解耦时,就使用对象的组合,还有,如果对基类还是有所偏见,那可以去看看微软的System.Collections和System.Web.Mvc下的实现,看看人家是如何设计的。

    以下是一个完整的,简单的数据操作基类,它将子类公用的属性数据库上下文(DataContext)抽象出来,将增删改查的Curd操作也抽象出来,结果,这个基类就变成了这样:

1     ///   2     /// 标准数据操作基类  3     ///   4     public abstract class DataBase : IRepository  5     {  6         ///   7         /// 数据访问对象(只对子类可见)  8         ///   9         protected DataContext DB; 10  11         #region Constructors 12         public DataBase() 13             : this(new LINQ.DataClasses1DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["XXB"].ToString())) 14         { } 15         public DataBase(DataContext db) 16             : this(() => { return db; }) 17         { } 18         public DataBase(Func
func) 19 { 20 this.DB = func(); 21 } 22 #endregion 23 24 #region DBContext SubmitChanges 25 ///
26 /// XXB默认提交【重写时候可能需要写入自定义的类似约束的逻辑】 27 /// 28 protected virtual void SubmitChanges() 29 { 30 ChangeSet cSet = DB.GetChangeSet(); 31 if (cSet.Inserts.Count > 0 32 || cSet.Updates.Count > 0 33 || cSet.Deletes.Count > 0) 34 { 35 try 36 { 37 DB.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict); 38 } 39 catch (System.Data.Linq.ChangeConflictException) 40 { 41 foreach (System.Data.Linq.ObjectChangeConflict occ in DB.ChangeConflicts) 42 { 43 occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 44 occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues); 45 occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges); 46 } 47 DB.SubmitChanges(); 48 } 49 } 50 } 51 52 #endregion 53 54 #region IRepository 成员 55 56 public virtual void Update
(TEntity entity) where TEntity : class 57 { 58 this.SubmitChanges(); 59 60 } 61 62 public virtual void Update
(IEnumerable
list) where TEntity : class 63 { 64 list.ToList().ForEach(entity => 65 { 66 this.Update
(entity); 67 }); 68 } 69 70 public virtual void Insert
(TEntity entity) where TEntity : class 71 { 72 DB.GetTable
().InsertOnSubmit(entity); 73 this.SubmitChanges(); 74 } 75 76 public virtual void Insert
(IEnumerable
list) where TEntity : class 77 { 78 DB.GetTable
().InsertAllOnSubmit
(list); 79 this.SubmitChanges(); 80 } 81 82 public virtual TEntity InsertGetIDENTITY
(TEntity entity) where TEntity : class 83 { 84 this.Insert
(entity); 85 return GetModel
(i => i == entity).FirstOrDefault(); 86 } 87 88 public virtual void Delete
(TEntity entity) where TEntity : class 89 { 90 DB.GetTable
().DeleteOnSubmit(entity); 91 this.SubmitChanges(); 92 } 93 94 public virtual void Delete
(IEnumerable
list) where TEntity : class 95 { 96 DB.GetTable
().DeleteAllOnSubmit
(list); 97 this.SubmitChanges(); 98 } 99 100 public virtual IQueryable
GetModel
() where TEntity : class101 {102 return this.DB.GetTable
();103 }104 105 public virtual IQueryable
GetModel
(System.Linq.Expressions.Expression
> predicate) where TEntity : class106 {107 return GetModel
().Where(predicate);108 }109 110 public virtual TEntity Find
(params object[] keyValues) where TEntity : class111 {112 var mapping = DB.Mapping.GetTable(typeof(TEntity));113 var keys = mapping.RowType.IdentityMembers.Select((m, i) => m.Name + " = @" + i).ToArray();114 TEntity entityTEntity = DB.GetTable
().Where(String.Join(" && ", keys), keyValues).FirstOrDefault();115 if (entityTEntity != null)116 DB.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, entityTEntity);117 return entityTEntity;118 }119 120 #endregion121 }

对于一个数据操作具体类来说,直接继承它就可以了,然后再去实现自己的业务逻辑,很清晰。

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
Miller-Rabin判质数和Pollared-Rho因数分解
查看>>
关于ajax请求数据后,数据本身的js失效的一些想法
查看>>
06-Flutter移动电商实战-dio基础_Get_Post请求和动态组件协作
查看>>
基础认识
查看>>
【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?...
查看>>
GetWindowRect和GetClientRect比较学习
查看>>
thinkphp 多表事务处理
查看>>
11-散列1 电话聊天狂人
查看>>
学SEO你其实只需要半个钟
查看>>
3G网卡PPP拨号
查看>>
AS3.0中的反射概念
查看>>
UIViewController中各方法调用顺序及功能详解
查看>>
C++ do{...}while(0)的好处
查看>>
【Todo】Python字符编码学习
查看>>
python实现朴素贝叶斯
查看>>
Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
查看>>
Java操作MongoDB:连接&增&删&改&查
查看>>
Maven使用
查看>>
用python脚本把windows的文件上传到linux中
查看>>
m_Orchestrate learning system---三十四、使用重定义了$的插件的时候最容易出现的问题是什么...
查看>>