问题描述
现在有这种情况:有多个结构差不多的类,指它们的成员变量,成员函数都基本相同,但它们,有个字段是互不相同的(声明类型跟值都不同)。很自然,我们会将这些类的共同部分,抽取出来,放在一个父类里,然后让这些类继承,这样就方便以多态的形式访问。但,对于前面说的那个不同的字段,又必须对其进行赋值跟访问,这种情况,又想实现多态,又得考虑到这个字段,该怎么办呢?即,应该怎么样将这个互不相同的字段提取到父类里呢???如下代码:(还没实现继承)publicclassSubClassA{publicintdifferentInt;//--------------互不相同字段privateStringcommonString;publicvoidcommonRun(){}}publicclassSubClassB{publicdoubledifferentDouble;//--------------互不相同字段privateStringcommonString;publicvoidcommonRun(){}}.......还有很多,结构类似的类,在些省略。很自然,我们会想到把公共部分提取到父类里。父类:publicclassParent{privateStringcommonString;publicvoidcommonRun(){}}各种子类:publicclassSubClassAextendsParent{publicintdifferentInt;//--------------互不相同字段}publicclassSubClassBextendsParent{publicdoubledifferentDouble;//--------------互不相同字段}........还有很多,结构类似的子类,在些省略。我们知道,如下的main方法,会出错:publicstaticvoidmain(String[]args){Parentp1=newSubClassA();p1.differentInt=0;//-----这里有错。Parentp2=newSubClassB();p2.differentDouble=0.0;//-------这里也有错。}对于,这种情况,应该怎么处理呢?即如何处理这个互不相同的字段,又实现多态?
解决方案
解决方案二:
放方法里去取
解决方案三:
可以用泛型publicclassParent<T>{privateStringcommonString;publicTdifferent;publicvoidcommonRun(){}}不放在父类里面个人感觉也没什么,参考下jdk中的buffer类,buffer类是一个抽象的公共父类。buffer类的每个子类都有get(),put()方法,但是每个子类的该方法的参数都不同,比如IntBuffer中的是get(int),put(int),FloatBuffer中的是get(float),put(float),最终jdk实现的时候get(),put()方法也没有放到父类中。
解决方案四:
用泛型怎么样?classParent<T>{privateStringcommonString;privateTdifferent;publicvoidcommonRun(){}publicTreturnDifferent(){return(T)null;}}
解决方案五:
classParent<T>{privateStringcommonString;privateTdifferent;publicvoidcommonRun(){}publicTreturnDifferent(){returndifferent;}}
解决方案六:
引用4楼billjimsam的回复:
JavacodeclassParent<T>{privateStringcommonString;privateTdifferent;publicvoidcommonRun(){}publicTreturnDifferent(){returndifferent;}}
感觉是可以解决问题哦,强!但,一般在类设计的时候,我们会怎么对待不同子类里,相互不同的成员呢?