有没有办法在接口默认方法中调用扩展类的方法?

问题描述 投票:0回答:2

我有大约 10 个应该实现接口的类。 这些类还直接或作为子扩展类扩展另一个类的类型。我无法更改我扩展的那些课程,因为它们不是我提供的。

interface IStuff 
{     
    default void doStuffInterface     
    {         
        // Call extended classes method and variable:        
        this.doStuffExtended(this.extendedVariable);     
    }     
    ... 
}  

class C1 
{     
    protected int extendedVariable;     
    protected void doStuffExtended(int var) { //do stuff }     
    ... 
}  

class C2 extends C1 
{    
     ... 
}

就我而言,我得到了扩展类 C1 或类 C2 的类,所有这些类都应该实现该接口。

我如何确保我的所有类都具有 doStuffInterface 的相同功能,而不必在每个类中专门编写它?

我想过给默认接口方法一个类 C1 的对象,但这行不通,因为方法和变量是受保护的。

java methods interface default extend
2个回答
0
投票

创建一个新的接口并扩展已有的接口。然后,您就可以在新界面中拥有默认方法。所有这些类都可以具有两个接口的功能以及通过实现新接口的默认方法。


0
投票

使用基类提供所需的功能,在您的情况下

C1
。使用 java 17+,您可以使用 密封类/接口 更进一步,仅通过
C1
允许扩展路径,确保每个继承者都使用此基本初始化。

non-sealed class C1 implements IStuff {

  private int extendedVariable;

  @Override
  public final void doStuffInterface() {
    doStuffExtended();
    doStuffSuperExtended();
  }

  private void doStuffExtended() {
    System.out.println("default initialization - " + extendedVariable);
  }

  protected void doStuffSuperExtended() {
    //nothing by default
    //extra actions by inheritors, if required
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.