У меня есть родительский класс AggDef, который является базовым типом некоторых дочерних классов (TermAggDef, StatAggDeff и т. д.). Класс определен ниже.
У меня есть код в другом классе, который перебирает список объектов AggDef и получает их типы. защищенные агрегации карт = new HashMap();
public List<String> getAggregationTypes(){
HashSet<String> aggTypes = new HashSet<String>();
Iterator it = aggregations.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
AggDef aggDef = (AggDef) pair.getValue();
aggTypes.add(aggDef.getType());
}
List<String> retList = new ArrayList<String>();
retList.addAll(aggTypes);
return retList;
}
Мой вопрос: могу ли я добиться этого полиморфного присвоения атрибута типа в самом родительском классе? Потому что везде, где будет использоваться объект AggDef, он будет знать, к какому типу он относится. Член моей команды сказал, что мне следует реализовать метод setType в реальных дочерних классах. Но я не думаю, что то, что у меня есть, неправильно. Любая помощь или уточнение точности моего подхода были бы очень полезны. Заранее спасибо.
public abstract class AggDef implements Cloneable {
protected String name;
protected String term;
protected String type;
...
protected List<AggDef> subAggregations;
public void setType(AggDef def){
if(def instanceof TermAggDef){
def.type = "terms";
}
else if (def instanceof StatAggDef){
def.type = "terms_stats";
}
else if (def instanceof RangeAggDef){
def.type = "range";
}
}
public String getType(){
return type;
}
protected AggDef() {
setType(this);
}
protected AggDef(String term) {
this.term = term;
setType(this);
}
protected AggDef(String name, String term) {
this.name = name;
this.term = term;
setType(this);
}
public AggDef(String term, String order, int size, int offset, boolean isAllTerms) {
this.term = term;
this.size = size;
...
setType(this);
}
public AggDef(String name, String term, String order, int size, int offset, boolean isAllTerms) {
this.name = name;
this.term = term;
...
setType(this);
}
}