Какой принцип SOLID нарушается в следующем коде?
public class A {
void hello(){
//some code here
}
}
public class B extends A {
int i;
void hello(){
i++;
}
}
Я думаю, что LSP (принцип подстановки Лискова) нарушается, потому что подкласс B нельзя подставить в переменную типа A. Я действительно не уверен в этом, и мне почему-то кажется, что ни один из принципов SOLID здесь не нарушен.
Еще одна вещь, о которой я подумал, это то, что i объявлен без модификатора доступа. Это должно быть нарушением? Если да, то какое нарушение?




В чем проблема не объявлять i приватным?
Из эффективного Java 3-го издания:
If a class is accessible outside its package, provide accessor methods to preserve the flexibility to change the class’s internal representation. If a public class exposes its data fields, all hope of changing its representation is lost because client code can be distributed far and wide.
However, if a class is package-private or is a private nested class, there is nothing inherently wrong with exposing its data fields.
Я думаю, что это довольно ясно показывает, когда нужно выставлять i, а когда нет.
С другой стороны, LSP не нарушается, потому что вы всегда можете написать
A a = new B();
Как правило, нецелесообразно оценивать, какой из принципов SOLID нарушается с помощью классов, значение которых неясно (например, классы A и B в вашем случае)
Но если вы знаете (контекстное) значение каждого класса, мы можем сделать некоторые комментарии. (Например, Employeeis-aPerson, а также Studentis-aPerson - так что LSP должен работать здесь - вы должны иметь возможность назначать объект Employee ссылке Person, и то же самое относится и к объекту Student)
@Nff, почему бы тебе не принять ответ, если он имеет смысл?
@deHaar извините, я ждал других ответов. Я принял это только сейчас.
Этот вопрос не по теме, и вы не должны задавать вопросы такого рода на Stack Overflow. Проверьте Как написать минимальный, полный и проверяемый пример. Попробуйте спросить здесь: cs.stackexchange.com