考虑一个由根类和一些子类组成的特定类层次结构
R
|
.--+--+------.
| | ... |
S1 S2 ... Sn
类R有一个特定类型的字段x
,比如X
,它不是一个简单的类型,每个子类都应该继承。子类可以对字段x
执行各种内部处理,也可以将其作为属性公开。
关于这两种编码风格中哪一种更受欢迎的讨论产生了一些讨论:
让课程R
将x
声明为私有字段并提供公共getter和setter
class R {
....
private X x;
....
public X getX() { ... }
public void setX(X ax) { ... }
}
让课程R
将x
声明为受保护的字段
您认为哪一个可能是首选解决方案?
答案 0 :(得分:3)
如果您希望子类访问受保护的变量。您希望您的子类使用方法来修改它,然后将其设为私有。
所有人都依赖于你想要其他课程的访问权。
编辑:(第一个解决方案)
答案 1 :(得分:1)
如果必须使用继承,这是最安全的方法:
class R
{
private X x;
protected X getX()
{
return this.x;
}
}
为什么不将R
作为单独的类并从S1, S2, ... Sn
引用它?
答案 2 :(得分:1)
这取决于你想要允许对内部X做什么。如果你想让它可以从外部访问/修改make public get / set。但是如果你希望它们只能通过它的子类进行修改,那么就使用protected,这就是全部。 IMHO
答案 3 :(得分:0)
私人领域更可取。但是,即使它是子类,也不应该从另一个类中更改另一个对象的内部状态。
听起来好像在R,S1,S2等X和X之间插入了巨大的耦合。更好地考虑替代的面向对象设计,明确地在对象之间分配责任。
考虑在继承子类之前查看Liskov替换原则。