попробуй Open - Close принцип в моем коде, но получил странное поведение в Java - PullRequest
0 голосов
/ 31 октября 2019
public interface MainInterface {
}

@Transactional
@Service
@Qualifier("A")
@Primary
public class A implements MainInterface {

}
@Transactional
@Service
@Qualifier("B")
public interface B implements MainInterface {

}
public interface C implements MainInterface {

}
@Service
public class InterfaceFactory {
 public MainInterface getInstance(String type ) {
    if (type.equalsIgnoreCase("A") ) {
        return new A();
    } else if (type.equalsIgnoreCase("B") ) {
        return new B();
    } else if (type.equalsIgnoreCase("C") ) {
        return new C();
    }else {
     return null;
    }
    }

    }

@Service
public class EventInterceptor {

 public ADTO callEvent(A a, Entity entity) throws URISyntaxException {
  System.out.print("A"); 
}
public ADTO callEvent(B b, Entity entity) throws URISyntaxException {
System.out.print("B"); 
}
public ADTO callEvent(C c, Entity entity) throws URISyntaxException {
System.out.print("C"); 
}
public ADTO callEvent(MainInterface  m, Entity entity) throws 
URISyntaxException {
System.out.print("MainInterface  ); 
}
}

//------------ i'm calling it like so 
MainInterface  obj= interfaceFactory.getInstanceInterface("A");
     gateWayInterceptor.callEvent( obj,entity)));

Проблема в том, что он всегда печатает MainInterface
и всегда вводит callEvent (MainInterface m, Entity entity), даже если тип возвращаемого значения A, или B, или C, это открыто, закрыто. Принцип реализации, как я понимаю,

Я пытался сделать его универсальным типом фабрики, но не смог попытаться удалить callEvent (MainInterface m, Entity entity), но я получил исключение, я сделал то же самое, что и код здесь в этом блоге https://blog.jetbrains.com/upsource/2015/08/31/what-to-look-for-in-a-code-review-solid-principles-2/о продано - открыть закрыть Принцип

должен вводить callEvent (A a, сущность сущности), а не callEvent (MainInterface m, сущность сущности)

Обратите внимание, что я использую Java 8

1 Ответ

0 голосов
/ 10 ноября 2019

Я не являюсь в первую очередь Java-разработчиком, но предположил бы, что это потому, что переменная obj, которую вы передаете в CallEvent, объявлена ​​как тип MainInterface ... попробуйте привести ее при передаче, то есть использовать "(A) obj"вместо того, чтобы просто" obj "и посмотреть, что вы получите.

Кроме того, я знаю, что вы упомянули, что вы играете здесь с принципом Open / Closed, но стоит упомянуть, что это технически нарушило бы принцип подстановки Лискова, который по сути заявляет, чтоесли вы делаете что-то с базовым классом, вы должны получить тот же результат, если вы делаете это с подклассом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...