The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 4,262 other subscribers

Scopes and names can really be deceiving. A classes in a hierarchy can have members with identical names…

Posted by jpluimers on 2019/11/21

Examples like the one below from [WayBack] Scopes and names can really be deceiving. A root class and a descendant class can both have public fields, properties and methods with the same name… – Lars Fosdal – Google+ used to be part of the “language day” during my 5 day Delphi introductory courses.

Maybe I should find back more of those from the days, brush them up a little, then post them in a repository.

The thread has some nice references to tools that give better warnings and comparisons with other languages.

Anyone wanting to assist with that?

Example code

program PublicScope;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

  type
  TClass1 = class
  public
    Test: Integer;
    constructor Create; virtual;
    procedure Dump; virtual;
    procedure Oops;
    property PropTest:Integer read Test;
  end;

  TClass2 = class(TClass1)
  public
    Test:Integer;
    constructor Create; override;
    procedure Dump; override;
    procedure Oops;
    property PropTest:Integer read Test;
  end;

{ TClass1 }

constructor TClass1.Create;
begin
  Test := 1;
end;

procedure TClass1.Dump;
begin
  Writeln('TClass1:', Test);
  Writeln('TClass1.PropTest:', Test);
end;

procedure TClass1.Oops;
begin
  Writeln('TClass1.Oops');
end;

{ TClass2 }

constructor TClass2.Create;
begin
  Inherited;
  Test := 2;
end;

procedure TClass2.Dump;
begin
  Inherited;
  Writeln('TClass2.Test:', Test);
  Writeln('TClass2.PropTest:', Test);
end;

procedure TClass2.Oops;
begin
  Writeln('TClass2.Oops');
end;

procedure Test;
var
  c: TClass1;
begin
  c := TClass2.Create;
  try
    Writeln('c: ', c.Test);
    c.Dump;
    c.Oops;
  finally
    c.Free;
  end;
end;

begin
  try
    try
      Test;
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    Write('Press any key: ');
    Readln;
  end;
end.

Example output

c: 1
TClass1:1
TClass1.PropTest:1
TClass2.Test:2
TClass2.PropTest:2
TClass1.Oops
Press any key:

–jeroen

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.