父类中是她们的集体艺术

本文版权归和讯和小编夏雯本身同盟持有。款待转发,转载和爬虫请注脚原来的文章地址 

今天早上,有个对象说学了悠久,依然没搞懂多态,让自家归纳讲授一下。作者感觉多态在面向多想的三大特征当中,算是最轻巧易行的,最难的是形似轻松的包装。在编辑面向对象代码时,怎么样让代码可读性更加强,除了变量和方法命名规范外,要做的到叁个办法只做风华正茂件业务,那样的合计是《代码整洁之道》生龙活虎书中驷不及舌珍爱的研商,其实有涉世的诸位都梦想团结看来的代码是简轻松单,可保障,可读性强的,相信我们也都“有幸”遭逢过几百上千行的代码,更过分的是有个对象早已维护二个上万行的Action,夸张的说,调节和测量检验并走通逻辑,一遍要二十五日,有人讲那是事情逻辑不断加码所引致,但自己认为,在此种处境下,更应当尽可能做到多个主意做生机勃勃件事情。小编也相当的少戏弄了,关于代码整洁,作者在大三的时候,就”玩弄”过。

包装亦不是前几日的主旨,不久前咱们要说的是多态,在朋友问小编的时候,笔者给她举了上边那些大致的例证。

全体归纳那几个事例来讲就是在基本的三层布局个中,DAL层建三个类AdminDal,UserDal。五个类中,都有扩张对象和删除对象地点法,那当时,大家应当给五个类大而无当出叁个父类BaseDal<T>,父类中是他俩的公共措施,何况父类需求叁个泛型T,那样父类的法子,技巧驾驭您所要增多或许去除的object到底是什么类型的。请看如下代码。就算四个类的国有措施在父类个中,可是她们自小编特有的诀窍,依旧要写在投机的Dal层此中。

1   public class UserDal: BaseDal<UserEntity>
2   {
3         
4   }

1   public class AdminDal: BaseDal<AdminEntity>
2     {
3         public void Manage()
4         {
5             Console.WriteLine("管理员管理网站");
6         }
7     }

 1 public class BaseDal<T>
 2     {
 3         public void AddObj(T obj)
 4         {
 5             Console.WriteLine("添加对象成功,对象属于"+obj.GetType().ToString());
 6         }
 7 
 8         public void DeleteObj(T obj)
 9         {
10             Console.WriteLine("删除对象成功,对象属于"+obj.GetType().ToString());
11         }
12 
13     }

 上边给出逻辑层代码,假如说普通的支付进程个中,你的代码恐怕是这么的。

 1  public class UserBll 
 2     {
 3         UserDal dal = new UserDal();
 4 
 5         public void Add(UserEntity obj)
 6         {
 7             dal.AddObj(obj);
 8         }
 9 
10         public void Delete(UserEntity obj)
11         {
12             dal.DeleteObj(obj);
13         }
14      }

    public class AdminBll 
    {
        AdminDal dal = new AdminDal();

        public void Add(AdminEntity admin)
        {
            dal.AddObj(admin);
        }
        public void Delete(AdminEntity admin)
        {
            dal.DeleteObj(admin);
        }

        public void Manage()
        {
            dal.Manage();
        }
     }

也即是在各自的逻辑层个中,调用dal层。此时你又见到仍然有那般多种复的代码,是还是不是应有再一次封装成二个BaseBll<T>呢。答案是洗颈就戮的,不过难点又来了,在包装父类的经过中,你会发觉,这些dal的目的怎么封装呢?那正是用到多态的关键点。下边看一下BaseBll.cs的代码。

 public abstract class BaseBll<T> where T:class, new()
    {
        public BaseDal<T> currentDal;

        public BaseBll()
        {
            SetCurrentDal();
        }

        public abstract void SetCurrentDal();


        public void BaseAdd(T obj)
        {
            currentDal.AddObj(obj);
        }

        public void BaseDelete(T obj)
        {
            currentDal.DeleteObj(obj);
        }

    }

笔者给了三个空洞的基类,而且付诸抽象的SetCurrentDal的悬空方法定义。该办法用于安装当前类的currentDal到底是adminDal如故userDal。大家在布局函数中调用SetCurrentDal这几个抽象方法,为啥在构造函数中调用的因由是,当实例化子类对象时,一定是率先步向其父类的布局函数。当子类AdminBll和UserBll继承BaseBll<T>的时候,必须重写抽象方法,並且为BaseDal<T>
currentDal对象设置实际的值。作者先给出子类的代码

 1 public class AdminBll : BaseBll<AdminEntity>
 2     {
 3         AdminDal dal = new AdminDal();
 4         public AdminBll()
 5         {
 6 
 7         }
 8         public void Manage()
 9         {
10             new AdminDal().Manage();
11         }
12 
13         public override void SetCurrentDal()
14         {
15             currentDal = new AdminDal();
16         }
17     }

1 public class UserBll : BaseBll<UserEntity>
2     {
3         public override void SetCurrentDal()
4         {
5             base.currentDal = new UserDal();
6         }
7     }

当实例化子类的指标时,过程为:子类构造函数(不进去)—步向父类构造函数—父类构造内部调用子类重写的SetCurrentDal(当前多态的currentDal到底是哪个人的实例)—父类布局实施完结(设置currentDal达成卡塔尔(英语:State of Qatar)—子类布局函数。那便是空虚方法完结的多态。

上边在UI层调用一下,看看结果:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             AdminBll adminBll = new AdminBll();
 6             AdminEntity admin = new AdminEntity() {AdminName="吴双",AdminPwd="123" };
 7             adminBll.Manage();
 8             adminBll.BaseAdd(admin);
 9             Console.ReadKey();
10         }
11     }

出口结果:

图片 1

 

在开垦的经过中,可能你会有为数不菲实体类,每个实体类都有各自的增加和删除改查等任何共有方法,基于那样的情形,大家就须求一手来将其卷入。为啥在逻辑层使用了多态,原因正是大家封装父类的时候,不分明当前的currentDal到底是adminDal照旧userDal还是xxxDal。为了封装出基类,这一个多态的指标就必得了。

理所必然在事实上圈套中,若是您是写原生sql,那样封装的确不易于,各类拼接sql。但倘使说你用ORM框架,EF,Dapper之类的,这几个艺术确实是少不了的,你大概再增加接口层,加上中国人民解放军海军事工业程大学业作单元,创建对象非new,使用抽象工厂,信任注入等。无论如何,那黄金时代层的多态一定能用到,只是创立对象稍作校订。

 

下意气风发阶段也筹算展开后台布局搭建分享,MVC
WebApi+EF/Dapper+专门的学问单元+抽象工厂/重视注入Autofac+AutoMapper+日志组件等。

自身也曾数次在项目中搭建此类框架,在缓存进步质量,管理高并发,应用服务器集群,缓存集群,队列集群等方面,此次也会步向到分享当中。

 

如果明天的蝇头分享,对您有一点滴援救,请打call支持,也为温馨的上进点赞。

点击下方关注,大家共同提升。

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website