在界面中添加新方法时如何摆脱覆盖所有 class
How to ged rid of override all class when add new method in interface
我有接口、抽象方法等class并使用这些引用类型如下。
public interface InterfaceA {
boolean mehod1();
boolean method2();
boolean newMethod(); //When added new method
}
public abstract class AbstractA implements InterfaceA{
// other common method
}
public Class C extend AbstractA //have to override three method
public Class D extend AbstractA //have to override three method
public Class E extend AbstractA //have to override three method but only should be override old method
public Class F extend AbstractA //have to override three method but only should be override old method
这些 classes 派生了 AbstractA class 我只想在接口中使用新方法但只实现 C 和 D class 其他应该只使用旧方法。
应该如何设计?
您应该考虑 SOLID 规则之一 - I
- "Interface segregation principle"。您可能需要创建一个新接口,而您的 C 和 D 类 可以实现多个接口。这是更好的设计方法。
您可以通过两种方式处理:
- 如果您使用的是 Java 7 或更低版本,请扩展 InterfaceA 以创建新接口
public InterfaceB extends InterfaceA{
// Your new methods definitions here..
}
让 类 C 和 D 实现 InterfaceB。
- 如果您使用的是 Java 8 或更高版本,请按照@Slaw 的建议,将默认方法添加到 InterfaceA。覆盖默认实现以在 类 C 和 D
中提供您的自定义实现
看起来你并没有真正使用继承。
如果C、D、E、F是A/AbstractAsub类,A中定义的任何方法都应该对所有这些sub类.
有意义
您不能阻止一个方法的子类继承而允许另一个方法继承。
如果您需要引入不同的概念,请使用不同的层次结构,但不要尝试设计统一的东西。
关于层次结构中公共实现的 DRY 的最佳方法是将公共实现移动到抽象 类 中用于需要实例字段的方法,并将它们移动到接口默认方法中用于不需要的方法他们。
我有接口、抽象方法等class并使用这些引用类型如下。
public interface InterfaceA {
boolean mehod1();
boolean method2();
boolean newMethod(); //When added new method
}
public abstract class AbstractA implements InterfaceA{
// other common method
}
public Class C extend AbstractA //have to override three method
public Class D extend AbstractA //have to override three method
public Class E extend AbstractA //have to override three method but only should be override old method
public Class F extend AbstractA //have to override three method but only should be override old method
这些 classes 派生了 AbstractA class 我只想在接口中使用新方法但只实现 C 和 D class 其他应该只使用旧方法。
应该如何设计?
您应该考虑 SOLID 规则之一 - I
- "Interface segregation principle"。您可能需要创建一个新接口,而您的 C 和 D 类 可以实现多个接口。这是更好的设计方法。
您可以通过两种方式处理:
- 如果您使用的是 Java 7 或更低版本,请扩展 InterfaceA 以创建新接口
public InterfaceB extends InterfaceA{
// Your new methods definitions here..
}
让 类 C 和 D 实现 InterfaceB。
- 如果您使用的是 Java 8 或更高版本,请按照@Slaw 的建议,将默认方法添加到 InterfaceA。覆盖默认实现以在 类 C 和 D 中提供您的自定义实现
看起来你并没有真正使用继承。
如果C、D、E、F是A/AbstractAsub类,A中定义的任何方法都应该对所有这些sub类.
有意义
您不能阻止一个方法的子类继承而允许另一个方法继承。
如果您需要引入不同的概念,请使用不同的层次结构,但不要尝试设计统一的东西。
关于层次结构中公共实现的 DRY 的最佳方法是将公共实现移动到抽象 类 中用于需要实例字段的方法,并将它们移动到接口默认方法中用于不需要的方法他们。