问题描述
|
考虑由根类和一些子类组成的特定类层次结构
R
|
.--+--+------.
| | ... |
S1 S2 ... Sn
类R具有某个类型的字段x
,例如X
,这不是一个简单类型,每个子类都应该继承该字段。子类可以对字段“ 1”进行各种内部处理,并将其公开为属性。
关于这两种编码方式中的哪一种是可取的,引起了一些讨论:
第一种解决方案
让类R
声明x
为私有字段并提供公共获取者和设置者
class R {
....
private X x;
....
public X getX() { ... }
public void setX(X ax) { ... }
}
第二解决方案
让类R
声明x
为受保护字段
您认为哪一个是更可取的解决方案?
解决方法
这取决于您希望对内部X进行的操作。如果希望从外部可以访问/修改它,请公开获取/设置。但是,如果您希望它们只能由其子类修改,则可以使用protected,仅此而已。恕我直言
, 如果您希望子类访问受保护的变量。您希望子类使用方法对其进行修改,然后将其设为私有。
所有希望访问的内容都取决于其他类。
编辑:(第一个解决方案)
, 如果必须使用继承,这是最安全的方法:
class R
{
private X x;
protected X getX()
{
return this.x;
}
}
为什么不将R
作为单独的类并从S1,S2,... Sn
中引用呢?
, 私有字段是可取的。但是,无论如何,都不应该从另一个类更改另一个对象的内部状态,即使它是子类。
听起来好像您在R,S1,S2等与X之间插入了巨大的耦合。更好地考虑面向对象的替代设计,从而在对象之间明确分配职责。
考虑在子类化之前先看一下Liskov替换原理。