Java 使用封装时是否有一些技巧来共享方法行为?

Java 使用封装时是否有一些技巧来共享方法行为?,java,inheritance,encapsulation,Java,Inheritance,Encapsulation,我得到了这个班级结构: abstract class A{ protected void doTest(){}; abstract void test(); } abstract class B extends A{ } class C extends B{ public void test(){ doTest(); } } class D extends A{ public void test(){ doTest(); } } D无法扩展B。 两

我得到了这个班级结构:

abstract class A{
  protected void doTest(){};
  abstract void test();
}

abstract class B extends A{
}

class C extends B{
  public void test(){
    doTest();
  }
}

class D extends A{
  public void test(){
    doTest();
  }
}
D无法扩展B。
两者中的test()将实现完全相同的功能(可以包含多行代码)。
目前,我被迫复制相同的行为。
我无法创建另一个类来实现该行为,因为它访问受保护的方法

有什么办法可以解决这个问题吗?

如果
test()
确实是相同的,那么它就不应该是抽象的

abstract class A{
  protected void doTest(){};

  public void test() {
    //Shared functionality calling doTest() and doing other stuff. 
  }
}
即使
test()
依赖于不同子类中的字段,您也可以创建抽象getter并使用它们:

abstract class A{
  protected void doTest(){};

  protected abstract String getName();

  public void test() {
    //Shared functionality calling doTest() and doing other stuff. 
    //Can also use getName()
  }
}

abstract class B extends A {}

class C extends B {

    @Override public String getName() { return "C"; }

}

class D extends A {

    @Override public String getName() { return "D"; }

}
如果
test()

abstract class A{
  protected void doTest(){};

  public void test() {
    //Shared functionality calling doTest() and doing other stuff. 
  }
}
即使
test()
依赖于不同子类中的字段,您也可以创建抽象getter并使用它们:

abstract class A{
  protected void doTest(){};

  protected abstract String getName();

  public void test() {
    //Shared functionality calling doTest() and doing other stuff. 
    //Can also use getName()
  }
}

abstract class B extends A {}

class C extends B {

    @Override public String getName() { return "C"; }

}

class D extends A {

    @Override public String getName() { return "D"; }

}

令人印象深刻的谢谢!这个问题我已经讨论了好几个月了:),直到今天我才知道该怎么回答这个问题,呵呵。。最后,我用抽象方法创建了另一个类E,它在A中使用。然后,我扩展了这样的类并实现了我真正需要的东西,它在C和D中都能完美地工作!!!令人印象深刻的谢谢!这个问题我已经讨论了好几个月了:),直到今天我才知道该怎么回答这个问题,呵呵。。最后,我用抽象方法创建了另一个类E,它在A中使用。然后,我扩展了这样的类并实现了我真正需要的东西,它在C和D中都能完美地工作!!!