gpt4 book ai didi

delphi - 保护田地是个好主意吗?

转载 作者:行者123 更新时间:2023-12-03 14:54:19 25 4
gpt4 key购买 nike

代码示例:

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。

如果您只是从同一单元内的后代类访问类成员,我仍然会将其保持为私有(private)。

但是,如果 FList 是您需要在 TBar 中重写的内容(可能不需要,因为它不是方法),或者被设计为继承类应该或将重写的内容,无论它是否在同一单元中,那么你会想让它受到保护。

如果您需要从同一单元外部的后代类访问 FList,您还需要提高 Protected 的可见性。

关于delphi - 保护田地是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8894128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com