抽象和静态有用的情况。我该如何解决?

时间:2015-11-18 12:52:32

标签: java abstract-class static-methods

我想有一个抽象的帮助器类,我在helper-sub-classes中实例化我需要的类。在抽象类中,有一个对所有子类都通用的方法,但它与每个子类有特定的差别,因此必须是临时实现的。 通常,辅助类只有静态方法,它是一个抽象的静态方法,因此它必须在所有子类中存在/实现,并且可以作为辅助方法调用。但是我们都知道这是不可能的......

这是我的具体例子:

public abstract class ClientHelper
{
  protected static A a= new A();
  protected static B b= new B();
  ...

  abstract static public String getX( String id );
}

public static class UserType1ClientHelper extends ClientHelper
{
  @Override
  public String getX( String id )
  {
    return a.getX(id, SPECIFIC_PARAMETER_FOR_USERTYPE1)
  }
  ...
}

public static class UserType2ClientHelper extends ClientHelper
{
  @Override
  public String getX( String id )
  {
    return b.getX(id, SPECIFIC_PARAMETER_FOR_USERTYPE2)
  }
  ...
}

如何以“可能的”方式重现这一点?

2 个答案:

答案 0 :(得分:1)

  

通常,辅助类只有静态方法   很高兴有一个抽象的静态方法

使用静态方法的Helper类很好,但如果你没有实现它,那么该方法如何作为abstract方法在Helper类中有用。

我理解,您希望使用ClientHelper类型引用为所有派生类调用该方法。由于该方法是抽象的,并且派生类必须为它提供实现,因此将其设为non-static,即删除静态并将其用作实例方法。

答案 1 :(得分:1)

由于基类需要知道A类和B类,您可以这样做:

enum ClientHelper {
    USER_TYPE_1(new A()),
    USER_TYPE_2(new B());

    private ClientHelper(... obj) {
    }

    public String getX(String id) {
        ...
    }

}

和/或

enum ClientHelper {
    USER_TYPE_1() {
        A a = new A();

        @Override
        public String getX(String id) {
             ...
        }
    },
    USER_TYPE_2() {
        ...
    };

    public abstract String getX(String id);

}

String x = ClientHelper.USER_TYPE2.getX("H");

后者更冗长,但允许更多的差异。

它使用每个枚举值都是静态实例。