问题描述
基类:publicabstractclassBizOrderETLBase<T>whereT:BizDatOrders{privateDateTime_timeFrom;privateDateTime_timeTo;publicDateTime_TimeFrom{get{return_timeFrom;}}publicDateTime_TimeTo{get{return_timeTo;}}publicBizOrderETLBase(DateTimetimeFrom,DateTimetimeTo){_timeFrom=timeFrom;_timeTo=timeTo;}publicBizOrderETLBase():this(DateTime.Today.AddDays(-1),DateTime.Today){}//其他方法。。。}
子类:publicclassDatOrdersETL:BizOrderETLBase<BizDatOrders>{readonlyDbSet<T_Business_AirOrders>_airOrderRepository;readonlyDbSet<T_Business_AirOrderFlights>_airOrderFlightsRepository;readonlyDbSet<T_Business_AirTickets>_airTicketsRepository;readonlyDbSet<T_Business_AirOrderBill>_airOrderBillRepository;readonlyDbSet<T_Business_Passengers>_passengersRepository;readonlyDbSet<T_User_Role>_roleRepository;readonlyDbSet<T_User_RoleRelation>_roleRelationRepository;readonlyDbSet<T_Code_Carriers>_carriersRepository;readonlyDbSet<T_Code_AirLineInfo>_airLineInfoRepository;publicDatOrdersETL():this(DateTime.Today.AddDays(-1),DateTime.Today){}publicDatOrdersETL(DateTimetimeFrom,DateTimetimeTo):base(timeFrom,timeTo){TravelPPEntities_travelPPContext=newTravelPPEntities();_airOrderRepository=_travelPPContext.Set<T_Business_AirOrders>();_airOrderFlightsRepository=_travelPPContext.Set<T_Business_AirOrderFlights>();_airTicketsRepository=_travelPPContext.Set<T_Business_AirTickets>();_airOrderBillRepository=_travelPPContext.Set<T_Business_AirOrderBill>();_passengersRepository=_travelPPContext.Set<T_Business_Passengers>();_roleRepository=_travelPPContext.Set<T_User_Role>();_roleRelationRepository=_travelPPContext.Set<T_User_RoleRelation>();_carriersRepository=_travelPPContext.Set<T_Code_Carriers>();_airLineInfoRepository=_travelPPContext.Set<T_Code_AirLineInfo>();}//其他方法。。。}
这是一个订单同步程序的设计。由于订单量大,同步订单需要指定起止时间,如果不指定,则默认同步前一天的订单数据。我的问题在子类的默认无参构造器,因为要给readonly的字段赋值,所以我不得不调用this(DateTime.Today.AddDays(-1),DateTime.Today),主要是参数,基类的构造器已经赋值了,这里子类又重新赋值,增大了子类的负担。如何优化呢?
解决方案
本帖最后由 gzyes 于 2015-09-17 15:54:06 编辑
解决方案二:
publicDatOrdersETL():base(){}就行了吧
解决方案三:
:base()其实会被隐式调用的,所以也是可以省略的
解决方案四:
引用1楼dongxinxi的回复:
publicDatOrdersETL():base(){}就行了吧
base不行,因为子类构造器里本身有自己的逻辑(初始化那些readonly的字段)。
解决方案五:
父类的无参构造函数还有存在的必要吗
解决方案六:
引用4楼tcmakebest的回复:
父类的无参构造函数还有存在的必要吗
我的本意是那个默认值让父类的无参构造器来实现,这样子类就轻松了。
解决方案七:
引用楼主gzyes的回复:
这是一个订单同步程序的设计。由于订单量大,同步订单需要指定起止时间,如果不指定,则默认同步前一天的订单数据。我的问题在子类的默认无参构造器,因为要给readonly的字段赋值,所以我不得不调用this(DateTime.Today.AddDays(-1),DateTime.Today),主要是参数,基类的构造器已经赋值了,这里子类又重新赋值,增大了子类的负担。如何优化呢?
要读取的数据,既然不应该在实例化对象时赋值,那就在第一次被调用者读取数据时才赋值呗。默认读取前一天的数据,这个实例化参数完全没有问题。关键是整体的流程太死了,不会延迟。
解决方案八:
搞半天还是不清楚你到底想做什么。子类的其他逻辑初始化其他字段,自然应该放在子类里,timeFrom,timeTo这两个依旧让父类的无参构造来初始化。难道你说的“子类重新赋值了”不仅仅指这两个字段吗
解决方案九:
看你的代码风格,我发现你倾向于比较死板、繁琐、任性、甚至滥用。单就程序设计知识上来说,你还是应该从别人那里多学点简单实际的编程知识,最好把自己的繁琐风格“收一收、简化一下”。
解决方案十:
@sp1234基类是泛型类,我代码贴错了,声明方式是publicabstractclassBizOrderETLBase<T>whereT:BizOrders子类里的T是BizDatOrders实体类,它继承于BizOrders。
解决方案十一:
oo用了五六年了,自叹oo不咋地,但是怎么算是比较好的设计呢?
解决方案十二:
光靠构造函数是不够的,构造函数中可以调用虚方法或者抽象方法,然后由具体实现由子类去重写或实现