关于类继承里的构造方法调用问题

问题描述

基类: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不咋地,但是怎么算是比较好的设计呢?
解决方案十二:
光靠构造函数是不够的,构造函数中可以调用虚方法或者抽象方法,然后由具体实现由子类去重写或实现

时间: 2024-08-02 23:58:57

关于类继承里的构造方法调用问题的相关文章

php-PHP 一个类里能直接调用类外部的函数吗?为什么

问题描述 PHP 一个类里能直接调用类外部的函数吗?为什么 PHP 一个类里能直接调用类外部的函数吗? PHP 一个类里能直接调用类外部的函数吗? PHP 一个类里能直接调用类外部的函数吗? PHP 一个类里能直接调用类外部的函数吗? PHP 一个类里能直接调用类外部的函数吗? 解决方案 在实验的时候发现是可以的,代码如下 <?php function func(){ echo "I'm a external function <br />"; } class Tes

继承-子类构造方法调用方法问题

问题描述 子类构造方法调用方法问题 是不是子类构造方法里调用了任何方法,不管是自己重构的构造方法,还是其他方法,系统就不会给super()了,初学者有疑问,求大神解答 解决方案 子类构造函数可以同时调用父类的super和其他方法,但是有语法限制,即如果需要调用父类super操作必须放在第一行.否则会有编译错误的. 解决方案二: 创建子类对象,是一定会调用其父类构造方法的,当你不写super()的时候, 调用的是父类默认构造方法

C#类中虚方法相互调用的潜在重载错误

错误    当我们编写基类虚方法时,需要注意一个问题,就是基类中虚方法的相互调用,有可能引起派生类重载时的潜在错误隐患.当然这个错误并不是C#语言设计的缺陷,而是一个不可避免的实现而已.当然如果我们是要编写通用的组建基类,就需要注意一下了.     或许我们刚开始做OOP的时候,对于有没有方法有没有virtual根本不在乎,很多是时候我们都重写了(rewrite)了基类方法.当然在需要确定重载(override)的时候,virtual关键字限定基类方法是不可少的.那么是不时我们就可以把基类的方法

Java语言入门教程(十三):Java语言中继承中的构造方法问题

教程(十一)中,了解了Java语言中继承的基本概念.Java中类与类的继承 ,是单继承,主要目的是复用.子类对象可以复用父类中权限允许的属性和方法 ,所以子类的构造方法和父类的构造方法之间,有一定的调用关系,本文中将进 行详细介绍. 首先,需要记住一个事实:子类的任何一个构造方法,都将先调用父类某个 构造方法.如子类Trainer中的构造方法: public Trainer() { } 虽然这个构造方法的方法体中什么代码也没有写,但是也调用了父类 Employee的构造方法,默认调用的是Empl

PHP类继承 extends使用介绍

 我们在文章中为大家详细介绍了有关PHP类继承 extends的实现方法,希望对于新手来说能够提升他们在PHP语言编程中的能力 出来工作这么久了,项目经验倒是不少,但是当问及底层的东西时候,常常是一言不发了.现在项目设计底层的东西越来越少,可以说是真正用到的也就是那么一点,真正核心的东西都已经被框架封装好了.总感觉自己一直进步很慢,关于底层设计思想,常常也只可意会.随着时间的流逝,我们常常会感慨书到用时方恨少了,接下来一定要恶补设计思想了.   今天先来复习一下类继承.   类继承很重要,作为程

php使用类继承解决代码重复的问题

 这篇文章主要介绍了php使用类继承解决代码重复的问题,实例分析了继承的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php使用类继承解决代码重复的问题.分享给大家供大家参考.具体分析如下: 继承直白地说就是给一个类建一个或多个子类,要创建子类就必须在类声明中使用 extends 关键字,新类名在前,extends 在中,父类名在后. 下例中,我们创建两个新类,BookProduct 和Cdproduct ,它们都继承自 ShopProduct 类. 代码如下:

Python类定义和类继承详解

  这篇文章主要介绍了Python类定义和类继承详解,本文讲解了类的私有属性.类的方法.私有的类方法.类的专有方法.类的定义.类的单继承.类的多继承等内容,需要的朋友可以参考下 一.类定义: ? 1 2 class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属性,那么将直接影响到已经实例化的对象 类的私有属性: __private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访

编程-java中在类定义里能实例化本类的对象吗?

问题描述 java中在类定义里能实例化本类的对象吗? 我在一本书上看到这个,这里的内容试讲java的构造方法私有化的 class Singleton { Singleton instance=new Singleton(); private Singleton() {} public void print() { System.out.println("Hello World"); } } 这个我想请教一下,为什么这里能在类定义里实例化本类的对象? 这里还列出了另一种方式: class

类继承的问题

问题描述 比如定义一个接口IM类M继承接口IM,并实现现在有类A.B或者更多类,需要继承IM接口和另一个类(A1.B1...),类A.B实现IM接口的方法和M类实现IM接口的方法是一样的除了classA:A1,IM.classB:B1,IM这样实现,这样实现都得重新实现IM,还得COPY过去还能有别的什么方法,不需要COPY过去的,加个中间类?classA2:A1,IM.classA:A2这样也挺麻烦的.如果有很多个类继承它,那不是要加很多个中间类啊interfaceIM{voidA();voi