Мой класс логики высказываний выглядит следующим образом:
public class ConnectiveNode extends BinaryNode {
...
private Connective.Type type;
...
public Connective.Type getType() {
return type;
}
private void changeTypeTo(Connective.Type newType) {
type = newType;
}
@Override
public void eliminateArrows() {
...
if (...) changeTypeTo(...);
...
}
@Override
public void toCNF() {
switch (type) {
case ...
case ...
...
}
}
}
Проблема заключается в том, что метод toCNF()
слишком велик, поскольку я помещаю все реализации для разных Connective.Type
s, я пытался создать подклассы, но еслиЯ делаю это, тогда метод changeTypeTo
не работает, потому что я должен изменить экземпляр подкласса на экземпляр другого подкласса.
Например, если у меня разные подклассы для разных типов, тоМне нужно изменить class A extends ConnectiveNode
на class B extends ConnectiveNode
, потому что переменная private Connective.Type type
больше его не идентифицирует, даже если я изменю type
на B
и getType()
вернет B
, кто-то еще можетиспользуйте someVar instanceof A
, чтобы проверить, является ли type
A
, что небезопасно.
Могу ли я узнать, как я должен спроектировать его так, чтобы я мог легко изменить его тип и не переполнять метод toCNF()
?
Обновление
Я пишу служебную логическую формулу служебный инструмент, который может выполнять такие вещи, как преобразование формулы в конъюнктивную нормальную форму , я сохраняю свою формулу в деревеструктураТипы соединений в основном implies: ->
, and: /\
, iff: <->
и т. Д., Поэтому при преобразовании в CNF я сначала удаляю все соединительные элементы в виде стрелок, например подразумевает, что формула преобразования равна p -> q == ~p \/ q
, поэтому мне нужноизмените Connective.Type
с implies: ->
на or: \/
. В методе toCNF()
я сначала вызывал eliminateArrows()
для левого и правого узла, затем выполнял такие операции, как if my type is \/ and left node is literal then ...
, что значительно больше if else if else
, и затруднял поддержку и чтение. Поэтому мне нужен способ легко изменить его Connective.Type
, не затопляя метод.