以下代码违反了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
时没有任何访问修饰符。应该违反吗?如果是,哪个违规?
答案 0 :(得分:3)
不声明i
为私人有什么问题?
从有效Java第三版开始:
如果可以在包外部访问类,请提供访问器方法,以保留更改类内部表示形式的灵活性。如果公共类公开其数据字段,则将失去所有更改其表示形式的希望,因为客户端代码可以分散分布。
但是,如果一个类是程序包私有的或私有嵌套的类,则公开其数据字段没有本质上的错误。
我认为很清楚何时需要公开i
,何时不公开。
另一方面,不违反LSP,因为您可以随时写入
A a = new B();
通常不宜使用含义不明确的类(例如您的情况下的类A
和B
)来评估哪些SOLID原则被违反了
但是,如果您知道每个类的(上下文)含义,那么我们可以提出一些意见。 (例如,Employee
is-a
Person
以及Student
is-a
Person
-因此LSP应该在这里工作-您应该能够分配Employee
对象到Person
引用的地方,Student
对象也有类似的事情)