1。我最近在写代码的问题。有两个属性非常相似的类,80%相同,其余不同。在设计的时候,我采用的继承方式是抽象的,除了一个父类,大致如下。有两个类FirstChild和SecondChild,因为属性名称、代码等相同,所以提取一个父类BaseDO,如下:packagecom.example.day01;publicclassBaseDO{privateStringname;私有字符串代码;私有字符串字段1;私有字符串字段2;publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicStringgetCode(){返回代码;}publicvoidsetCode(Stringcode){this.code=code;}publicStringgetField1(){返回field1;}publicvoidsetField1(Stringfield1){this.field1=field1;}publicStringgetField2(){返回字段2;}publicvoidsetField2(Stringfield2){this.field2=field2;}@OverridepublicStringtoString(){return"BaseDO{"+"name='"+name+'\''+",code='"+code+'\''+",field1='"+field1+'\''+",field2='"+field2+'\''+'}';}}FirstChildpackagecom.example.day01;publicclassFirstChildextendsBaseDO{privateStringmyField1;privateStringmyFiled2;publicStringgetMyField1(){returnmyField1;}publicvoidsetMyField1(StringmyField1){this.myField1=myField1;}publicStringgetMyFiled2(){returnmyFiled2;}publicvoidsetMyFiled2(StringmyFiled2){this.myFiled2=myFiled2;}@OverridepublicStringtoString(){return"FirstChild{"+"myField1='"+myField1+'\''+",myFiled2='"+myFiled2+'\''+"}"+super.toString();}}SecondChildpackagecom.example.day01;publicclassSecondChildextendsBaseDO{privateStringsecondField1;privateStringsecondField2;publicStringgetSecondField1(){返回第二个字段1;}publicvoidsetSecondField1(StringsecondField1){this.secondField1=secondField1;}publicStringgetSecondField2(){返回secondField2;}publicvoidsetSecondField2(StringsecondField2){this.secondField2=secondField2;}@OverridepublicStringtoString(){return"SecondChild{"+"secondField1='"+secondField1+'\''+",secondField2='"+secondField2+'\''+"}"+super.toString();}}从上面看到这两个子类除了父类的属性之外还有各自的属性,现在有个需求就是要实例化这两个子类2.如何解决2.1。分离初始化什么是分离初始化?所谓单独初始化,就是各自初始化,为每个子类实现初始化其属性的方法,如下:FirstChildfillFirstField(FirstChildfirstChild){firstChild.setCode("苹果");firstChild.setMyField1("第一个孩子");返回第一个孩子;}SecondChildfillSecondField(SecondChildsecondChild){secondChild.setName("apple");secondChild.setCode("苹果");.setSecondField1("第二个孩子");返回第二个孩子;}这里作为演示,所有属性都没有赋值。如果两个子类有很多相同的属性,那么赋值会比较麻烦,两个方法的代码重复度会很高。2.2.抽象出一个公共方法既然已经为两个子类抽象出了公共属性,那么顺着这个思路,也可以抽象出一个公共方法来为这些公共属性赋值,也就是为类填充属性父类,BaseDOfillField(BaseDObaseDO){baseDO.setName("apple");baseDO.setCode("苹果");返回基础DO;那么接下来就是初始化自己的属性了。接下来实例化FirstChild,然后初始化它的公共属性FirstChildfirstChild=newFirstChild();填充字段(第一个孩子);firstChild.setMyField1("第一个孩子");系统.out.println(firstChild);打印出firstChild的结果如下。可以看到公共属性name、code和特殊属性myField1已经赋值完成上述需求。有的同学可能会用下面的写法。可以看到这个写法有错误,说明我们需要的类型是FirstChild,但是我们提供的BaseDO,我们知道fillField方法返回的BaseDO类型,不能给一个父类型的实例赋值一个孩子。类型引用(反之子类型的实例可以赋值给父类型,典型的多态),怎么办,垂头丧气,是的,下面细心的朋友会问,为什么fillField方法可以接受FirstChild比如,哈哈哈,上面红字中提到的多态性。怎么样,是不是对多态有了更深的理解。从fillField方法稍微扩展一下,我们知道这个方法不能设置返回值,为什么不能设置返回值,因为引用类型不是传值,可以理解为引用,哈哈,所以它被称为引用类型,在fillField方法中修改了它的引用类型的参数,所以在该方法执行后,其他引用这个参数的引用也能感知到它的修改。下面的写法就是一个很好的证明。是否加深了参照物和被参照物?它们之间的关系,我给大家说说引用在jvm的内存模型中是在哪个区域,引用指向的对象是什么?3.总结本文分析了在开发过程中遇到多个公共属性较多的实体类时的设计思路,抽取公共父类,父类承担公共属性。而在进行属性填充的时候,如果public属性的值都相同,那么就可以抽取public方法进行属性填充,这里说到多态。提取公共财产;理解多态性;沮丧;传递引用类型;最后各位读者,对于类似的需求,你们有更好的设计思路吗?欢迎积极讨论。
