如何指定抽象类

时间:2016-07-15 08:10:19

标签: java abstract-class generic-programming

我发现了很多关于这个主题的帖子,但无法找到我想要的解决方案。

所以这是交易:

我有一个带有两个子类的第一个抽象类:

public abstract class A {
  public A(args){..}
}
public class B extends A {
  public B(args){
    super(args);
  }
}
public class C extends A{
  public C(args){
    super(args);
  }
}

args 是一些变量但不会改变形式。 其他一些东西都在课堂上,但这并不重要。

现在,我有另一个带有两个子类的抽象类,它们是B和C的构建器。构建器的大部分是相同的,所以我希望它在抽象构建器中

public abstract class Builder {
  public A build(*?*){
    //compute args
    return new *either B or C*(args);
  }
}
public class B_Builder extends Builder {
  public B build(*?*){
    super(*?*);
  }
}
public class C_Builder extends Builder{
  public C build(*?*){
    super(*?*);
  }
}

再一次,建造者中的其他东西并不重要。

我的问题是如何通过构建器子类告诉Builder abastract类构建的返回类型。 知道返回类型B和C都延伸A. 我想我应该使用一些通用的东西,但我无法让它工作。

任何人都可以帮助我吗?

非常感谢!

LD

5 个答案:

答案 0 :(得分:1)

你可以使用泛型类型参数和抽象创建器方法来完成构造,而抽象类可以完成繁重的工作:

    A a1 = BuilderA.of(B.class, 1);        
    A a2 = BuilderA.of(C.class, 2);
    B b = BuilderA.of(B.class, 2);
    C c = BuilderA.of(C.class, 2);

答案 1 :(得分:0)

是的,你足够接近,通用是要走的路:

public abstract class A <T extends A<?>>{

    public abstract T getObject(Object args);
}

<强> B:

   public class B extends A<B>{

        @Override
        public B getObject(Object args) {
            // TODO Auto-generated method stub
            return null;
        }

    }

<强> C:

public class C extends A<C>{

    @Override
    public C getObject(Object args) {
        // TODO Auto-generated method stub
        return null;
    }


}

答案 2 :(得分:0)

将模板参数添加到超类构建器。

class Builder<T> {
  T build() {}
}

然后当你扩展使用像

这样的东西时
   class ABuilder extends Builder<A> {
      A build() {}
    }

   class BBuilder extends Builder<B> {
      B build() {}
    }

完整代码,其中包含Codiva online compiler IDE中的工作示例。

答案 3 :(得分:0)

我建议将相同的部分放在一个方法中,B和C的创建代码应该在子构建器中。

public abstract class Builder<T> {
  public abstract T create(args);
  public void build(args){
    //do something here
    return create(args); 
  }
}
public class BBuilder extends Builder<B> {
  @Override
  public B create(int args) {
    return new B(args);
  }
}

答案 4 :(得分:-1)

您只能使用一个构建方法保留一个构建器,如下所示:

Dim strSQL As String
If DCount("Id","panelCOmment","ID=" & Me!Text14) >0 then
strSQL = "Update panelComment set Comments = '" & Me!Text29 & "' where Id = " & Me!Text14
else
   strSQL = "INSERT INTO panelComment (ID, Comments) VALUES (" & Me!Text14 & ", '" & Me!Text29 & "');"

ENd if
DoCmd.RunSQL strSQL

此方法使用反射来构建具有指定类型的实例。它假定在​​类A,B和C的构造函数中使用相同类型的参数。以下是调用的外观:

dplyr

在上面的调用中,所有类都有一个Integer类型的构造函数。如果你有多个参数,你可以使用varargs作为最后一个参数并检索vararg的类并使用它们来检索正确的构造函数。