๐Ÿš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.pascal
Article #92372

operatr - przyklad beldu

#92372
From: webmajsterek
Date: Thu, 03 Jan 2008 12:46
224 lines
5937 bytes
1. 
tworzymy nowy projekt w lazarusi e, 1 farma , na nia memo i button .

2.
kody unitow 

 unit1
--------------------------

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,Unit2;


type

  { TForm1 }

  TForm1 = class (TForm )
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click (Sender: TObject );
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation




{ TForm1 }

procedure TForm1.Button1Click (Sender: TObject );
var Test:ObjectAbstract;
begin
  Test:=ObjectAbstract.Create;
{ operatory 1 ,3 ,4 ,5  wlaczoen -  2, 6 zakomentowany }
  with Memo1.Lines do begin
  
    Add('-------------------');
    Add('Odczytanie pola prze prox  -- dziala test obiektu ');
    Add(Test.Dane);
    Add('Laczony lancuch -przez prox '+Test.Dane);
    
    
    Add('');
    Add('-------------------');
    Add('Niejeawne wywolanie operatora Strin:=ObjectAbstract');
    Add(Test);
// mozna sie o tym przekonac po usneiciu (linie zakomentowac )
// operatora oznaczonego numerem 1  unit2


    Add('');
    Add('-------------------');
    Add('Niejeawne wywolanie operatora String:=ObjectAbstract+String');
    Add(Test+'Laczony lancuch -przez operator ');

// mozna sie o tym przekonac po usneiciu ( linie zakomentowac )
// operatora oznaczonego numerem 3 unit2
// a teraz  niespodzianka --  odkomentowac operator 2 i zakomentowac
// operator 3 ( wczesniej bez nigo program sie nie kompilowal )
// wniosek  niejawnie  kompilator podstawia w to miejsce operator 2

    Add('');
    Add('-------------------');
    Add('Niejeawne wywolanie operatora String:=String+ObjectAbstract');
    Add('Laczony lancuch -przez operator '+Test);

// zakomentowac operator 4 ( operaotry wlaczoen 1 ,2,5  - 3,4 wylaczoen )
// znowu niespodzianka - kompiluje sie  .
// niejawnie jest podstawiany operator 5 -- tka jak by chial  dodac 2 classy 
// mozna sie o tym przekoanc zakomentowujac  operator 5  - wtedy sie nie kompiluje
// oczywiscie odkomentowanie prawidlowych operatorow powoduje ze program
// dziala poprawnie

// wniosek  -  komilator podstawia co mu podpanie , i  nie sposb
// tego bledu wykryc

//
//  Test:=Test+Byte(1);
//  Test:=Test+Test;
  end;
end;

initialization
  {$I unit1.lrs}

end.  


--------------------

unit 2

--------------------

unit Unit2; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils; 
type
  AbstractAbstract=class
   private
     FDane : String;
     function  GetString :String   ;virtual;abstract;
     procedure AddString (S:String);virtual;abstract;
   public
   property Dane:String read GetString write AddString;
  end;

  ObjectAbstract=class(AbstractAbstract)
   private
      procedure AddString (S:String);override;
      function  GetString   :String ;override;
   public
   end;
{ 1 }
operator := ( A:AbstractAbstract ):String;
{ 2 }
//operator := ( S:String):AbstractAbstract;

{ 3 }
operator +  (A:AbstractAbstract;S  :String                  ):String ;
{ 4 }
operator +  (S:String;A:AbstractAbstract                    ):String ;

{ 5 }
operator +  (A,B:AbstractAbstract                           ):AbstractAbstract;
{ 6 }
operator +  (A:AbstractAbstract;B:Byte                      ):AbstractAbstract;

implementation

operator := ( A:AbstractAbstract ):String;
begin
  Result := A.Dane;
end;

operator := ( S:String):AbstractAbstract;
begin
end;

operator := ( S:String):ObjectAbstract;
begin
end;



operator +  (A:AbstractAbstract;S  :String                  ):String ;
begin
  Result := A.Dane+S;
end;

operator +  (S:String;A:AbstractAbstract                    ):String ;
begin
  Result := S+A.Dane;
end;

operator >>  (A:AbstractAbstract;B:Byte                      ):AbstractAbstract;
begin
end;


operator +  (A,B:AbstractAbstract                           ):AbstractAbstract;
begin
end;

operator +  (A:AbstractAbstract;B:Byte                      ):AbstractAbstract;
begin
   Result:=A;
   Result.Dane:=Result.Dane+char(49+B);
end;

operator +  (A:ObjectAbstract;B:Byte                      ):ObjectAbstract;
begin
   Result:=A;
   Result.Dane:=Result.Dane+char(48+B);
end;

//-----------------//
//-----------------//
//  AbstractObject

procedure ObjectAbstract.AddString(S:String);
begin
  FDane:=FDane+S;
end;

function ObjectAbstract.GetString:String;
begin
  Result:=FDane + ' ::= '+ TimeToStr(Now);
end;

end.
                                       
-----------------------

3. kolejny problem to tez jakies dziwne traktowanie przez kompilator 
przeciazania -- np dla Test  w procedurze Add  jest niejawnie wywolywany 
operator +  dla  przodka ( AbstractAbstract ) . A kilka lini nizej 
kompilator nie chce przepuscic  dodawania mimo ze przodek ma zadeklarowane
dodawanie Byte ( trzeba te linie odkomentowac ) .




-- 
Wysล‚ano z serwisu OnetNiusy: http://niusy.onet.pl
Technical Details
Message-ID: <630c.0000006f.477cd90e@newsgate.onet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsgate.onet.pl!niusy.onet.pl

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsgate.onet.pl!niusy.onet.pl
From: webmajsterek@poczta.onet.pl
Newsgroups: pl.comp.lang.pascal
Subject: operatr - przyklad beldu
Date: 3 Jan 2008 13:46:06 +0100
Organization: Onet.pl SA
Lines: 224
Message-ID: <630c.0000006f.477cd90e@newsgate.onet.pl>
NNTP-Posting-Host: newsgate.onet.pl
Mime-Version: 1.0
X-Trace: newsgate.test.onet.pl 1199364366 610 213.180.130.18 (3 Jan 2008 12:46:06 GMT)
X-Complaints-To: abuse@onet.pl
NNTP-Posting-Date: 3 Jan 2008 12:46:06 GMT
X-Mailer: http://niusy.onet.pl
X-Forwarded-For: 79.184.30.164, 192.168.243.39
X-User-Agent: Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.1.10)    Gecko/20071202 Firefox/2.0.0.10
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit