两个对象同方式实现IColored接口且无法多继承,如何避免代码重复?
嘿,这个问题太常见了——当两个八竿子打不着的类(比如跑车和苹果)要实现同一个接口的相同逻辑,但又没法靠继承共享代码时,确实得换个思路。下面给你几个靠谱的解决方案:
方案1:组合(Composition)+ 辅助实现类
这是最符合开闭原则的做法,核心思路是把重复的代码抽成一个独立的辅助类,然后让Ferrari和RedApple通过组合的方式复用它的逻辑,而不是继承。
比如先写一个专门处理颜色逻辑的类:
public class RedColorProvider { public String getColor() { return "Red"; } }
然后让你的两个业务类持有这个类的实例,实现IColored接口时直接调用它的方法:
public class Ferrari implements IColored { private final RedColorProvider colorProvider = new RedColorProvider(); @Override public String getColor() { return colorProvider.getColor(); } // Ferrari自己的其他方法... } public class RedApple implements IColored { private final RedColorProvider colorProvider = new RedColorProvider(); @Override public String getColor() { return colorProvider.getColor(); } // RedApple自己的其他方法... }
这样以后如果颜色逻辑要改,只需要改RedColorProvider就行,不用动两个业务类,非常灵活。
方案2:接口默认方法(Default Method)
如果你用的是Java 8及以上版本,接口支持添加默认方法——直接把getColor的实现写到IColored接口里,这样实现类就不用重复写代码了,除非需要自定义逻辑。
示例代码:
public interface IColored { default String getColor() { return "Red"; } } // 实现类直接空实现接口就行,不用写getColor public class Ferrari implements IColored { // Ferrari自己的方法... } public class RedApple implements IColored { // RedApple自己的方法... }
这个方案最简单,但要注意:接口的职责应该是定义契约,不是提供具体实现。如果这个颜色逻辑是所有IColored实现类的通用行为,那没问题;但如果以后有其他实现类需要不同的颜色,直接重写默认方法就行。
方案3:静态工具类
如果逻辑特别简单,不想搞那么复杂的类结构,也可以把重复的代码放到静态工具类里,让两个业务类直接调用。
比如:
public class ColorUtils { public static String getRedColor() { return "Red"; } } public class Ferrari implements IColored { @Override public String getColor() { return ColorUtils.getRedColor(); } } public class RedApple implements IColored { @Override public String getColor() { return ColorUtils.getRedColor(); } }
这个方案最简洁,但缺点是不够灵活——如果以后要扩展不同的颜色逻辑,工具类可能会变得臃肿,不如组合方式好维护。
总的来说,优先推荐组合方案,它的解耦性和扩展性最好;如果只是简单的通用逻辑,默认方法或者静态工具类也能搞定。
内容的提问来源于stack exchange,提问作者Peter Pohl
相关产品推荐
相关产品推荐

