Какой принцип SOLID нарушается в следующем коде? - PullRequest
0 голосов
/ 08 апреля 2019

Какой принцип SOLID нарушается в следующем коде?

public class A {
  void hello(){
    //some code here
  }
}

public class B extends A {
  int i;
  void hello(){
    i++;
  }
}

Я думаю, что LSP (принцип подстановки Лискова) нарушается, потому что подкласс B не может быть подставлен в переменную типа A. Я действительно не уверен в этом, и почему-то я думаю, что ни один из принципов SOLID здесь не нарушается.

Еще одна вещь, о которой я думал, это то, что i объявлен без какого-либо модификатора доступа. Должно ли это быть нарушением? Если да, то какое нарушение?

1 Ответ

3 голосов
/ 08 апреля 2019

В чем проблема с не объявлением i private?

Из Effective Java 3rd edition:

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

Однако , если класс является частным для пакета или частным вложеннымкласс, нет ничего плохого в том, чтобы выставлять его поля данных.

Я думаю, это довольно ясно дает понять, когда нужно выставить i, а когда нет.

Вкл.с другой стороны, LSP не нарушается, потому что вы всегда можете написать

A a = new B();

Обычно нецелесообразно оценивать, какой из принципов SOLID нарушается с классами, значение которых неясно (например, классы A и B в вашем случае)

Но если вы знаете (контекстуальное) значение каждого класса, тогда мы можем сделать некоторые комментарии.(Например, Employee is-a Person, а также Student is-a Person - поэтому здесь должен работать LSP - вы должны иметь возможность назначить объект Employee для ссылки Person ито же самое относится и к Student объекту)

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