加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi中“严格私有”和“受保护”访问修饰符之间的区别?

发布时间:2020-12-15 10:06:01 所属栏目:大数据 来源:网络整理
导读:但是我用Pascal语言学习编程和结构化编程之后,我开始用Delphi了解OOP. 所以,我真的不明白严格的私人教学和受保护的指令之间的区别..所以这里是我的代码,它是关于一个“包”的创作,只是介绍我的德尔福的教训,老师告诉我们如何创建对象: uses SysUtils;Type T
但是我用Pascal语言学习编程和结构化编程之后,我开始用Delphi了解OOP.

所以,我真的不明白严格的私人教学和受保护的指令之间的区别..所以这里是我的代码,它是关于一个“包”的创作,只是介绍我的德尔福的教训,老师告诉我们如何创建对象:

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;

所以这只是对象创建的一个例子.我明白什么是公共声明(外界接近的界面),但是我看不到私有和受保护的声明有什么区别..谢谢你试图帮助我..

解决方法

私人,受保护和公共的区别是非常简单的:

私有成员/方法仅在声明它们的类中可见.
>受保护的成员/方法在类和所有子类中都是可见的.
>所有其他类都可以看到公共成员和方法.

在Delphi中有一个“bug”,使所有成员在同一个单元内公开的可见性. strict关键字纠正了这个行为,所以私有实际上是私有的,甚至在一个单元内.为了良好的封装,我建议始终使用strict关键字.

示例代码:

type
  TFather = class
  private
    FPriv : integer;
  strict private
    FStrPriv : integer;
  protected
    FProt : integer;
  strict protected
    FStrProt : integer;
  public
    FPublic : integer;
  end;

  TSon = class(TFather)
  public
    procedure DoStuff;
  end;

  TUnrelated = class
  public
    procedure DoStuff;
  end;

procedure TSon.DoStuff;
begin
  FProt := 10;       // Legal,as it should be. Accessible to descendants.
  FPriv := 100;      // Legal,even though private. This won't work from another unit!
  FStrictPriv := 10; // <- Compiler Error,FStrictPrivFather is private to TFather
  FPublic := 100;    // Legal,naturally. Public members are accessible from everywhere.
end;

procedure TUnrelated.DoStuff;
var
  F : TFather;
begin
  F := TFather.Create;
  try
    F.FProt := 10;     // Legal,but it shouldn't be!
    F.FStrProt := 100; // <- Compiler error,the strict keyword has "made the protection work"
    F.FPublic := 100;  // Legal,naturally.
  finally
    F.Free;
  end;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读