Article View: pl.comp.lang.pascal
Article #92372operatr - przyklad beldu
From: webmajsterek
Date: Thu, 03 Jan 2008 12:46
Date: Thu, 03 Jan 2008 12:46
224 lines
5937 bytes
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.plShow 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