以下代码违反了哪种SOLID原则?

问题描述 投票:0回答:1

以下代码违反了哪种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没有任何访问修饰符。这应该是违规吗?如果是,哪种违规行为?

java oop solid-principles
1个回答
3
投票

没有声明i私有的问题是什么?

从Effective Java第3版开始:

如果类可以在其包之外访问,则提供访问器方法以保留更改类的内部表示的灵活性。如果公共类公开其数据字段,则所有改变其表示的希望都会丢失,因为客户端代码可以远程分发。

但是,如果一个类是包私有的或者是一个私有的嵌套类,那么暴露其数据字段本身就没有任何错误。

我认为,当需要暴露i以及何时不暴露时,它非常清楚。

另一方面,LSP不会被违反,因为你总是可以写

A a = new B();

通常不适合评估哪些SOLID原则违反了其含义不明确的类(如您所用的类AB

但是如果你知道每个类的(上下文)含义,那么我们可以做一些评论。 (例如,Employee is-a PersonStudent is-a Person - 所以LSP应该在这里工作 - 你应该能够将Employee对象分配给Person参考,类似的事情也适用于Student对象)

© www.soinside.com 2019 - 2024. All rights reserved.