java – 如何在继承不是一个选项时实现重复行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何在继承不是一个选项时实现重复行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2052字,纯文字阅读大概需要3分钟。
内容图文
![java – 如何在继承不是一个选项时实现重复行为](/upload/InfoBanner/zyjiaocheng/809/0e769b4db7f448fa8e717c9fefaa399e.jpg)
我有两个共享一些属性和行为的类.一个这样的共同行为集群是3D空间中的操纵.因此,每个实现接口Transformable:
public interface Transformable {
public void position (double x, double y, double z);
public void position (Tuple3d tuple);
public void rotateDeg (double yaw, double pitch, double roll);
public void rotateRad (double yaw, double pitch, double roll);
// And so on...
}
public class Foo extends Apple implements Transformable { // Foo happens }
public class Bar extends Orange implements Transformable { // Bar happens }
现在,Transformable中每个方法的行为对于任何实现类都是相同的,并且所需的代码是实质性的.
Foo和Bar各自扩展了我无法控制的不同超类,并且Java没有多重继承,因此该选项已经完成.
将大量代码复制粘贴到实现Transformable的每个类中都与所有编程相对立.
我能够想到的最好的解决方案是创建一个包含所有实现细节的类,并使用传递方法:
public Foo extends Apple implements Transformable {
// This class has all of the repeated implementation code
private TransformationHelper helper;
public final void rotate (double yaw, double pitch, double roll) {
helper.rotate(yaw, pitch, roll);
}
}
但是,这只比重复每个类中的代码要好一些.虽然实际的实现代码在一个位置,但这仍然非常笨拙.
有没有人有更好的方法解决这个问题?
编辑:为了澄清,我确实可以控制Transformable.整个想法是:Foo和Bar完全不同.它可以很容易地成为Shoe和SpaceShuttle,但是它们都存在于3D空间的不同位置,并且需要一个.position(x,y,z)方法来完成同样的事情.
解决方法:
您的解决方案对Java完全有效.您实际上正在使用设计模式Use Composition Over Inheritance.
正如@Naruto_Biju_Mode在评论中所说,如果您使用的是Java 8,则可以将实现移动到Transformable的默认方法,但是您必须使辅助类具有静态方法,因为您在接口中不能有任何实例字段
interface Transformable {
default void rotate (double yaw, double pitch, double roll) {
TransformationHelper.rotate(yaw, pitch, roll);
}
...
}
或者代替辅助类,您可以将完整实现放在默认方法中.这取决于您是否需要在其他地方使用这些方法
interface Transformable {
default void rotate (double yaw, double pitch, double roll) {
//actual implementation without helper class
}
...
}
无论哪种方式,如果您使用默认方法,则只需要覆盖,如果您想使用其他实现
内容总结
以上是互联网集市为您收集整理的java – 如何在继承不是一个选项时实现重复行为全部内容,希望文章能够帮你解决java – 如何在继承不是一个选项时实现重复行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。