代码示例:
unit Foo;
TFoo = class
protected
FList: TList; // Lifetime is managed by constructor and destructor
public
property List: TList read FList;
constructor Create;
destructor Destroy; override;
end;
unit Bar;
TBar = class(TFoo)
procedure MyMethod;
end;
procedure TBar.MyMethod;
begin
// Access of FList goes here
end;
TBar类能够直接修改FList的值,但这不是严格必需的,因为它只需要调用其方法/使用其属性即可。
我应该将FList设为私有(private),而是使用该属性从TBar访问它吗?
您如何处理此类案件?还有性能方面的考虑吗?
最佳答案
虽然我同意您可以以最少的特权开始,并在需要时将其移至可见性,但这仅是因为最终可以生成正确的面向对象的设计,而不必为类成员是否是真正的业务功能而深思熟虑。应该暴露出来。
您应该封装并隐藏对象中尽可能多的复杂性,以使外部接口(interface)尽可能地简化。实现此目的的一种方法是仅在需要时添加或公开属性。
如果您不需要外部访问类的特定成员,则它可能只是实现工件,并且不适合该类的实际业务用途。因此,它的复杂性应该被隐藏。
在这种情况下,因为TBar继承自TFoo,所以Protected是有效的可见性级别,因为它是为继承的类保留的。另外,由于TBar是从TFoo继承的,也许您认为它应该对TFoo的内部工作有一些额外的特权,因为它毕竟是它的子类。为什么我们要让TBar具有与其他类相同的低访问级别?
答案取决于FList是TFoo的实际类成员(我们考虑TFoo模型代表什么)还是仅仅是实现细节。另外,所需的访问级别是多少?我们只是访问它,还是在更改实现?
我猜想您不需要访问FList,也不需要更改实现,在这种情况下,即使两个类位于同一单元中,我仍然会将FList设置为Private,而不是Protected。
如果您只是从同一单元中的子孙类访问类成员,我仍将其保密。
但是,如果FList是您需要在TBar中覆盖的东西(可能不是,因为它不是方法),或者被设计为继承类应该或将要覆盖的东西(无论它是否在同一单元中),那么您将希望使其受到保护。
如果需要从同一单元外部的子孙类访问FList,则还需要将可见性提高到“ protected ”。