Java 在接口中添加新方法时如何避免重写所有类

Java 在接口中添加新方法时如何避免重写所有类,java,methods,abstract,implements,Java,Methods,Abstract,Implements,我有接口、抽象方法和更多分类,并使用这些引用类型,如下所示 public interface InterfaceA { boolean mehod1(); boolean method2(); boolean newMethod(); //When added new method } public abstract class AbstractA implements InterfaceA{ // other common method } p

我有接口、抽象方法和更多分类,并使用这些引用类型,如下所示

   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
这些类派生了一个抽象类,我只想在接口中实现新方法,但只实现C和D类,其他类应该只使用旧方法


应该如何设计?

你应该考虑一条坚实的规则——
I
-“接口隔离原则”。您可能需要创建一个新接口,并且您的C和D类可以实现多个接口。这是一种更好的设计方法。

你应该考虑一条坚实的规则——
I
-“接口隔离原则”。您可能需要创建一个新接口,并且您的C和D类可以实现多个接口。这是一种更好的设计方法。

您可以通过两种方式处理它:

  • 如果您使用的是Java 7或更低版本,请扩展InterfaceA以创建新接口
  • 让C类和D类实现接口B

  • 如果您使用的是Java8或更高版本,正如@Slaw所建议的,请向InterfaceA添加默认方法。重写默认实现以在类C和D中提供自定义实现

  • 您可以通过两种方式进行处理:

  • 如果您使用的是Java 7或更低版本,请扩展InterfaceA以创建新接口
  • 让C类和D类实现接口B

  • 如果您使用的是Java8或更高版本,正如@Slaw所建议的,请向InterfaceA添加默认方法。重写默认实现以在类C和D中提供自定义实现

  • 看起来您没有将继承性用于它的本来面目。
    如果C、D、E、F是A/AbstractA子类,那么A中定义的任何方法都应该适用于所有这些子类。
    不能阻止一个方法的子类继承,而允许另一个方法继承。
    如果需要引入不同的概念,可以使用不同的层次结构,但不要试图设计出不统一的东西


    对于层次结构中的公共实现来说,最好的方法是将公共实现移动到需要实例字段的方法的抽象类中,并将它们移动到不需要实例字段的方法的接口默认方法中

    看起来您没有将继承性用于它的本来面目。
    如果C、D、E、F是A/AbstractA子类,那么A中定义的任何方法都应该适用于所有这些子类。
    不能阻止一个方法的子类继承,而允许另一个方法继承。
    如果需要引入不同的概念,可以使用不同的层次结构,但不要试图设计出不统一的东西


    对于层次结构中的公共实现来说,最好的方法是将公共实现移动到需要实例字段的方法的抽象类中,并将它们移动到不需要实例字段的方法的接口默认方法中

    使用默认方法?要么不将其添加到抽象类,要么将实现的版本添加到抽象类,要么提供实现。具体类必须为其扩展的抽象类的所有抽象方法和实现的所有接口提供实现。这就是要遵守的契约。使用默认方法?要么不将其添加到抽象类,要么向抽象类添加实现的版本,要么提供实现。具体类必须为其扩展的抽象类的所有抽象方法和实现的所有接口提供实现。这是合同要尊重的。谢谢,这是重要的规则界面分离原则。我将定义新的接口,这是重要的规则接口隔离原则。我将定义新的接口
        public InterfaceB extends InterfaceA{
        // Your new methods definitions here..
        }