答案 0 :(得分:14)
我不会说它本身。一个类可以有一个责任,但在这个过程中做多个事情,并为履行其职责所需要做的每一组事情实现一个接口。
此外,Java中的接口可用于说明类具有哪些属性(例如,Comparable
和Serializable
),但不能真正说出类的责任。
但是,如果一个类实现了多个接口,每个接口都对应一个责任,则将违反该原则。
答案 1 :(得分:2)
可能,但不一定。
界面不是责任。 There's a very powerful mode of architecture将接口视为定义对象可能在应用程序中播放的角色。
想想这意味着什么。你可以拥有一个带有各种接口的Person
类(让我们使用.net约定进行命名)
class Person : IAmAStudent, IDrawSocialSecurity, IAmACitizen {
public SocialSecurityNumber getSocialSecurityNumber() {
return this.ssn;
}
private SocialSecurityNumber ssn;
public Person(SocialSecurityNumber ssn) { this.ssn = ssn; }
}
现在显然这不能违反SRP。它显然只有一个改变的原因 - 如果人与社会保障号码之间的关系发生变化。然而,该对象实现了许多接口,并在应用程序中扮演了几个角色。
现在,如果您正在实施多个暴露不同功能的接口,那么您可能违反了SRP,但这也可能是一个判断调用。单一责任原则是实现松散耦合的一个很好的经验法则,但这并不是城里唯一的理想。还有高内聚,它指出相关代码应该共存。这两者基本上是不一致的(虽然通常有办法实现良好的平衡)。因此,您可以合理地选择一个方向,并有意识地决定违反SRP。
最终,SRP和所有SOLID规则更多的是确保您按照某些方式思考,而不是每次都盲目地遵循它们。
答案 2 :(得分:1)
“单一责任”取决于抽象程度。例如,在系统级考虑它的复杂系统可能有一个责任。例如,电视系统的责任是显示视频图像。在下一个较低级别,该系统由子系统,监视器,动力装置等组成。在这个级别,每个单元都有自己的责任。
同样,一个级别的班级可能被认为只有一个责任。但是,在较低级别,它可能具有执行其部分工作的其他组成模块(类,接口等)。例如,学生班的职责是代表学生抽象。然而,它可能有另一个代表学生地址的单元(一个班级)。
通过这种方式,使用多个接口本身并不违反面向对象的原则。