关于java的类设计问题 - 如何使用接口和抽象类
以现实生活举例,说人的内部组成吧。大致可分血液人类循环系统,人类骨架系统,人类神经系统,人类消化系统我可以为这4大系统分别设计4个普通的,可以实例化成对象的类(因为具体的...
以现实生活举例,说人的内部组成吧。
大致可分血液人类循环系统,人类骨架系统,人类神经系统,人类消化系统
我可以为这4大系统分别设计4个普通的,可以实例化成对象的类(因为具体的人可以实例化,每个人都有这些系统,这些也需要实例化)- 分别是 class BloodCycle; class Bones; class Nerves; class Digesting;
现在的问题是,实际生活中,血液循环系统和消化系统都会用到肝脏。那么BloodCycle和Digesting类内部具体要怎么设计呢?
我的考虑如下:
肝脏是个具体的事物,设计成普通的可以实例化成多个对象的类比较合适,假设有普通类class Liver;
考虑将Liver对象作为BloodCycle和Digesting的内部成员,即2个类中分别定义Liver humanLiver;初始化的时候直接实例化Liver类。可问题是,实际生活中,一个人有BloodCycle和Digesting,但是却只应该有一个Liver,而我这样设计,会造成一个人有2个Liver被实例化了,也就是有2个肝脏。这明显不合适?
3. 考虑通过继承Liver来实现,但是问题是JAVA不支持类多继承,而BloodCycle和Digesting需要继承其他的抽象类,无法再继承Liver类。这个办法也行不通。
求大牛指点,应该如何设计才最妥当 既符合JAVA规范,也符合现实生活 ?
谢谢~ 展开
大致可分血液人类循环系统,人类骨架系统,人类神经系统,人类消化系统
我可以为这4大系统分别设计4个普通的,可以实例化成对象的类(因为具体的人可以实例化,每个人都有这些系统,这些也需要实例化)- 分别是 class BloodCycle; class Bones; class Nerves; class Digesting;
现在的问题是,实际生活中,血液循环系统和消化系统都会用到肝脏。那么BloodCycle和Digesting类内部具体要怎么设计呢?
我的考虑如下:
肝脏是个具体的事物,设计成普通的可以实例化成多个对象的类比较合适,假设有普通类class Liver;
考虑将Liver对象作为BloodCycle和Digesting的内部成员,即2个类中分别定义Liver humanLiver;初始化的时候直接实例化Liver类。可问题是,实际生活中,一个人有BloodCycle和Digesting,但是却只应该有一个Liver,而我这样设计,会造成一个人有2个Liver被实例化了,也就是有2个肝脏。这明显不合适?
3. 考虑通过继承Liver来实现,但是问题是JAVA不支持类多继承,而BloodCycle和Digesting需要继承其他的抽象类,无法再继承Liver类。这个办法也行不通。
求大牛指点,应该如何设计才最妥当 既符合JAVA规范,也符合现实生活 ?
谢谢~ 展开
展开全部
我的想法是这样:
四种系统和肝脏都可以设计成类,互相之间没有继承关系。
一般来说,类A继承类B,对应于现实中的“A是B”,可以借此判断是否应该用继承。比如,钢琴是乐器,所以class Piano可以继承class Instrument。在这里,血液循环系统是肝脏吗?显然不是,所以class BloodCycle继承class Liver在概念上就是不合适的。
至于一个人只有一个肝的问题,在初始化4个系统时不要初始化肝脏就行了。类BloodCycle和类Digesting都有一个类Liver的内部成员humanLiver,不初始化,而是开放一个接口,让调用者来创建一个Liver对象然后赋给BloodCycle对象和Digesting对象。伪码:
BloodCycle bloodCycle = new BloodCycle();
Digesting digesting = new Digesting();
Liver liver = new Liver();
bloodCycle.setHumanLiver(liver);
digesting.setHumanLiver(liver);
这样所有问题都解决了。Java里所有对象变量都是指针,所以bloodCycle和digesting里的humanLiver指向的是同一个对象,即共用同一个人的肝脏,符合现实生活。
四种系统和肝脏都可以设计成类,互相之间没有继承关系。
一般来说,类A继承类B,对应于现实中的“A是B”,可以借此判断是否应该用继承。比如,钢琴是乐器,所以class Piano可以继承class Instrument。在这里,血液循环系统是肝脏吗?显然不是,所以class BloodCycle继承class Liver在概念上就是不合适的。
至于一个人只有一个肝的问题,在初始化4个系统时不要初始化肝脏就行了。类BloodCycle和类Digesting都有一个类Liver的内部成员humanLiver,不初始化,而是开放一个接口,让调用者来创建一个Liver对象然后赋给BloodCycle对象和Digesting对象。伪码:
BloodCycle bloodCycle = new BloodCycle();
Digesting digesting = new Digesting();
Liver liver = new Liver();
bloodCycle.setHumanLiver(liver);
digesting.setHumanLiver(liver);
这样所有问题都解决了。Java里所有对象变量都是指针,所以bloodCycle和digesting里的humanLiver指向的是同一个对象,即共用同一个人的肝脏,符合现实生活。
展开全部
简单来说,
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,
另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,
另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询