以下代码违反了哪种SOLID原则?
public class A {
void hello(){
//some code here
}
}
public class B extends A {
int i;
void hello(){
i++;
}
}
我认为LSP(Liskov替换原则)被违反,因为子类B
不能被替换为A
类型的变量。我真的不确定这一点,不知怎的,我认为这里没有违反SOLID原则。
我一直在考虑的另一件事是声明i
没有任何访问修饰符。这应该是违规吗?如果是,哪种违规行为?
没有声明i
私有的问题是什么?
从Effective Java第3版开始:
如果类可以在其包之外访问,则提供访问器方法以保留更改类的内部表示的灵活性。如果公共类公开其数据字段,则所有改变其表示的希望都会丢失,因为客户端代码可以远程分发。
但是,如果一个类是包私有的或者是一个私有的嵌套类,那么暴露其数据字段本身就没有任何错误。
我认为,当需要暴露i
以及何时不暴露时,它非常清楚。
另一方面,LSP不会被违反,因为你总是可以写
A a = new B();
通常不适合评估哪些SOLID原则违反了其含义不明确的类(如您所用的类A
和B
)
但是如果你知道每个类的(上下文)含义,那么我们可以做一些评论。 (例如,Employee
is-a
Person
和Student
is-a
Person
- 所以LSP应该在这里工作 - 你应该能够将Employee
对象分配给Person
参考,类似的事情也适用于Student
对象)