“严格私有”和“严格私有”之间的区别和“受保护” Delphi 中的访问修饰符?
但我学习编程,在使用 Pascal 语言进行结构化编程之后,我开始使用 Delphi 学习 OOP。
所以,我不太明白 strict private
指令和 protected
指令之间的区别。所以这是我的代码,它是关于“bag”创建的,它是刚刚介绍了我的Delphi课程,老师向我们展示了如何创建对象:
uses
SysUtils;
Type
Tbag= class (Tobject)
strict private
FcontenM : single;
Fcontent : single;
protected
function getisempty : boolean;
function getisfull: boolean;
public
constructor creer (nbliters : single);
procedure add (nbliters : single);
procedure clear (nbliters : single);
property contenM : single read FcontenM;
property content : single read Fcontent;
property isempty : boolean read getisempty;
property isfull : boolean read getisfull;
end;
function Tseau.getisempty;
begin
result := Fcontent = 0;
end;
function Tseau.getisfull;
begin
result := Fcontent = FcontenM;
end;
constructor Tseau.creer(nbliters: Single);
begin
inherited create;
FcontenM := nbliters;
end;
procedure Tbag.add (nbliters: Single);
begin
if ((FcontenM - Fcontent) < nbliters) then fcontent := fcontenM
else Fcontent := (Fcontent + nbliters);
end;
procedure Tbag.clear (nbliters: Single);
begin
if (Fcontent > nbliters) then Fcontent := (Fcontent - nbliters)
else Fcontent := 0;
end;
所以这只是一个创建对象的例子;我理解什么是公共声明(外部可访问的接口),但我不明白私有声明和受保护声明之间有什么区别。感谢您试图帮助我。
but I learn programming and after structured programming with Pascal language, I'm beginning to learn about OOP with Delphi.
So, I don't really understand the difference between the strict private
instruction and the protected
one.. So here is my code, it's about a "bag" creation, it's just the introduction of my Delphi's lesson, teacher show us how we can create objects:
uses
SysUtils;
Type
Tbag= class (Tobject)
strict private
FcontenM : single;
Fcontent : single;
protected
function getisempty : boolean;
function getisfull: boolean;
public
constructor creer (nbliters : single);
procedure add (nbliters : single);
procedure clear (nbliters : single);
property contenM : single read FcontenM;
property content : single read Fcontent;
property isempty : boolean read getisempty;
property isfull : boolean read getisfull;
end;
function Tseau.getisempty;
begin
result := Fcontent = 0;
end;
function Tseau.getisfull;
begin
result := Fcontent = FcontenM;
end;
constructor Tseau.creer(nbliters: Single);
begin
inherited create;
FcontenM := nbliters;
end;
procedure Tbag.add (nbliters: Single);
begin
if ((FcontenM - Fcontent) < nbliters) then fcontent := fcontenM
else Fcontent := (Fcontent + nbliters);
end;
procedure Tbag.clear (nbliters: Single);
begin
if (Fcontent > nbliters) then Fcontent := (Fcontent - nbliters)
else Fcontent := 0;
end;
So it's just an example of object creation; I understand what is public declaration (interface approachable by the outside) but I don't see what's the difference between private and protected declarations.. Thanks for trying to help me..
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
私有、受保护和公共之间的区别非常简单:
Delphi 中存在一个“bug”,它使同一单元内所有成员的可见性都公开。 strict 关键字纠正了这种行为,因此 private 实际上是私有的,即使在单个单元内也是如此。为了获得良好的封装,我建议始终使用 strict 关键字。
示例代码:
The difference between private, protected and public is pretty straightforward:
In Delphi there's a "bug" that makes the visibility of all members public within the same unit. The strict keyword corrects this behaviour, so that private is actually private, even within a single unit. For good encapsulation I would recommend always using the strict keyword.
Example code:
严格私有 - 仅在此类中可见和访问。
私有 - 仅在此类和此类单元内可见和可访问。
protected - 与后代类中的 private PLUS 相同
您可以在此处阅读有关封装的更多信息和想法:http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29#Encapsulation
strict private - visible and accesible only from within this class.
private - visible and accesible only from within this class AND this class unit.
protected - the same as private PLUS from within descendant classes
You can read more about and idea of encapsulation here: http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29#Encapsulation
您可以到处查找(关键字是“访问修饰符”)
基本上,受保护意味着成员将在子类和整个单元中可见。严格私有意味着您只能访问此类的成员方法中的成员。
You could have looked this up everywhere (the keyword would be "access modifiers")
Basically, protected means that the members will be visible in child classes and throughout the unit. strict private means you have access to the member in member methods of this class ONLY.
其他答案中缺少一种情况:
private
甚至strict private
其他实例的字段可以从其类中的代码访问:(这与 Java 中的行为相同。)
One case is missing in the other answers:
private
and evenstrict private
fields of other instances can be accessed from code within their class:(This is the same behavior as in Java.)
其他答案中缺少另一个案例。
有可能“扩展”类封装规则。
使用 Delphi 8 中引入的类帮助器(为了 .NET 兼容性),可以绕过
私有、受保护和公共(甚至严格的符号)之间的可见性差异。
类助手声明可以位于原始类之外的另一个单元中。
这是一个示例:
有关更多信息,请参阅此帖子:访问 delphi 类的严格保护属性。
One other case missing in the other answers.
There are possibilities to "extend" the class encapsulation rules.
With class helpers, introduced in Delphi 8 (for .NET compatibility), it is possible to circumvent the
difference in visibility between private,protected and public (and even the strict notations).
The class helper declaration can be in another unit than the original class.
This is an example :
See this post for more information :access-a-strict-protected-property-of-a-delphi-class.