2015-02-05 5 views
2

Я на 100% уверен, что это было предложено раньше, но я не знаю, что Google:JAVA - создавать объекты абстрактного класса в зависимости от аргументов

Предположим, у меня есть абстрактный класс Ngram, что в основном только список:

abstract class Ngram { 
private List<Word> words = new ArrayList<Word>(); 
... } 

ли теперь можно создать объект подкласса Юниграмма, Биграммные ... в зависимости от параметра п? Что-то вроде этого:

int n; 
for(Word w : Sentence.getWordList()) { 
Ngram ngram = new Ngram(n); 
... } 

Так конструктор Ngram будет выглядеть примерно так:

Ngram(int n) { 
if(n==1) : //create Object of Type Unigram, let ngram refer to this object 
} 

Я попытался вернуть новую Юниграмму, но это не работает. Я думаю, это не самая лучшая идея, чтобы позволить конструктору абстрактного суперкласса сделать это, но я не понимаю, как решить эту проблему. Любые советы оценили, спасибо

ответ

3

Там есть шаблон для точно этого, Factory.

class Ngram { } 
class Ugram extends Ngram { } 
class Bigram extends Ngram { } 

public class NgramFactory { 
    public static Ngram createNgram(int n) { 
     if (n ==1) { 
      return new Ugram(); 
     } else { 
      return new Bigram(); 
     } 
    } 
} 

Использование: NgramFactory.createNgram(x)

+0

Спасибо, что на самом деле делает много смысла. –

0

Используйте Factory -Pattern, чтобы создавать новые объекты на основе вашего параметра

1
public Ngram createNgram(int n){ 
    switch(n){ 
    case 1: 
     return new Unigram(); 
    case 2: 
     ... 
    } 
} 
+0

Э-э, на самом деле это действительно хороший способ избежать всех if if (n == ...) else if() операторов, спасибо –

Смежные вопросы