Как привести другой подкласс к суперклассу в цикле? - PullRequest
0 голосов
/ 21 ноября 2018

Я пишу анализатор разметки на Java.Я создал классы для каждого вида токенов на основе суперкласса (общего?), Который я называю BaseToken.Внутри каждого токена находится Pattern объект и String для содержимого.Я пишу функцию, которая находит ближайший токен в строке от определенной начальной точки в строке.Чтобы выяснить, какой шаблон будет работать лучше всего, я создал массив BaseToken экземпляров, которые будут зациклены при тестировании.

BaseToken определяется как:

public class BaseToken{
    public Pattern pattern = null;
    private BaseToken[] children;
}

Пример подкласса BaseToken выглядит следующим образом:

public class H3 extends BaseToken{
    public Pattern pattern = Pattern.compile("\\=\\=\\=([^\\s*].*?)\\=\\=\\=");
}

Моя проблема с этим заключается в том, что для доступа к Pattern, специфичному для подкласса, мне нужно специально привести этот подкласс кего экземпляр внутри массива.Так как типы токенов будут отличаться в каждом цикле, я не могу просто разыграть его с помощью (subclass)instance.

Я пытался найти похожие ситуации для себя, но на самом деле я не знаю, что искать,Если это дубликат существующей проблемы, извините.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я предлагаю вам превратить BaseToken в абстрактный класс:

public abstract class BaseToken {
    public abstract Pattern getPattern();

    /* ...other stuff */
}

Тогда ваши различные токены могут расширить его и вернуть свои конкретные шаблоны:

public class H3 extends BaseToken {
    public Pattern getPattern() {
        return Pattern.compile("\\=\\=\\=([^\\s*].*?)\\=\\=\\=");
    }
}

Имея BaseToken bt (и не зная его точного подтипа), вы все равно можете позвонить bt.getPattern().

0 голосов
/ 21 ноября 2018

Это не лучший способ использовать полиморфизм.Вы должны либо превратить BaseToken в интерфейс, либо в абстрактный класс и создать метод, специфичный для манипулирования шаблоном.Затем вы должны иметь подтипы, реализующие этот метод, чтобы каждый класс мог манипулировать своим собственным шаблоном (который должен быть закрытым для класса) по-своему , не нарушая вызывающий код (вы должны прочитать о подстановке Лисковапринцип).

Простой пример:

abstract class BaseToken {
   abstract Pattern getPattern();
}

class H3 extends BaseToken {
  private Pattern pattern = ...

  Pattern getPattern() {
    return pattern;
  }
}

class Whatever extends BaseToken {
  private Pattern aCompletelyDifferentPattern = ...

  Pattern getPattern() {
    return aCompletelyDifferentPattern;
  }
}

Теперь вы можете делать что-то вроде:

BaseToken token = new H3();
Pattern currentPattern = token.getPattern();

Независимо от того, какой подкласс вы используете, это будетвсегда возвращайте соответствующий шаблон.

...