Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2006-03

polymorphism question

5 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Darius Blaszijk

I would like to declare a polymorph class. The class has several properties and it's the read and write specifiers that I want to be virtual abstract. So derived classes override the read and write specifiers. The problem however is that I get an EAbstractError. The property is still considered to be abstract according to the compiler. So what did I wrong? I have added an example below. Is it perhaps not allowed to use this construct? What would then be the best way? Darius

<<example>>

unit MyTest;
{$mode objfpc}{$H+}
interface
uses
  Classes, ComCtrls, SysUtils;
type
  TCustomClass = class
  private
    //virtual mehods
    function GetMyProperty: string; virtual; abstract;
    procedure SetMyProperty(Value: string); virtual; abstract;
  published
    property MyProperty: string Read GetMyProperty Write SetMyProperty;
  end;
  TMyClass = class(TCustomClass)
  private
    FMyProperty: string;
    function GetMyProperty: string; overload;
    procedure SetMyProperty(Value: string); overload;
  published
    property MyProperty;
  end;
implementation
function TMyClass .GetMyProperty: string;
begin
  Result := FMyProperty;
end;
procedure TMyClass .SetMyProperty(Value: string);
begin
  if Value = FMyProperty then
    exit;
  FMyProperty := Value;
end;
end.

Reply by email

Unknown author

(I sent this mail yesterday but somehow it didn't get trough, therefore a new try)

I would like to declare a polymorph class. The class has several properties and it's the read and write specifiers that I want to be virtual abstract. So derived classes override the read and write specifiers. The problem however is that I get an EAbstractError. The property is still considered to be abstract according to the compiler. So what did I wrong? I have added an example below.
Is it perhaps not allowed to use this construct? What would then be the best way?
Darius

<<example>>

unit MyTest;
{$mode objfpc}{$H+}
interface
uses
  Classes, ComCtrls, SysUtils;
type
  TCustomClass = class
  private
    //virtual mehods
    function GetMyProperty: string; virtual; abstract;
    procedure SetMyProperty(Value: string); virtual; abstract;
  published
    property MyProperty: string Read GetMyProperty Write SetMyProperty;
  end;
  TMyClass = class(TCustomClass)
  private
    FMyProperty: string;
    function GetMyProperty: string; overload;
    procedure SetMyProperty(Value: string); overload;
  published
    property MyProperty;
  end;
implementation
function TMyClass .GetMyProperty: string;
begin
  Result := FMyProperty;
end;
procedure TMyClass .SetMyProperty(Value: string);
begin
  if Value = FMyProperty then
    exit;
  FMyProperty := Value;
end;
end.

Reply by email

Rodrigo Palhano
to Unknown author: (I sent this mail yesterday but somehow it didn't get trough, therefore a new try) I…
Show quoted text 67 lines
(I sent this mail yesterday but somehow it didn't get trough, therefore a new try) I would like to declare a polymorph class. The class has several properties and it's the read and write specifiers that I want to be virtual abstract. So derived classes override the read and write specifiers. The problem however is that I get an EAbstractError. The property is still considered to be abstract according to the compiler. So what did I wrong? I have added an example below. Is it perhaps not allowed to use this construct? What would then be the best way? Darius <<example>> unit MyTest; {$mode objfpc}{$H+} interface uses Classes, ComCtrls, SysUtils; type TCustomClass = class private //virtual mehods function GetMyProperty: string; virtual; abstract; procedure SetMyProperty(Value: string); virtual; abstract; published property MyProperty: string Read GetMyProperty Write SetMyProperty; end; TMyClass = class(TCustomClass) private FMyProperty: string; function GetMyProperty: string; overload; procedure SetMyProperty(Value: string); overload; published property MyProperty; end; implementation function TMyClass .GetMyProperty: string; begin Result := FMyProperty; end; procedure TMyClass .SetMyProperty(Value: string); begin if Value = FMyProperty then exit; FMyProperty := Value; end; end. _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Try override instead of overload

Rodrigo Palhano --------------------------------- Equipe SpeedCASE

Reply by email

Unknown author
to Rodrigo Palhano

I made a typo which I didn't notice, thanks for the replies.

Show quoted text 83 lines
On Fri, 03 Mar 2006 04:52:36 -0300, wrote: > (I sent this mail yesterday but somehow it didn't get trough, therefore > a > new try) > > I would like to declare a polymorph class. The class has several > properties and it's the read and write specifiers that I want to be > virtual abstract. So derived classes override the read and write > specifiers. The problem however is that I get an EAbstractError. The > property is still considered to be abstract according to the compiler. > So > what did I wrong? I have added an example below. > Is it perhaps not allowed to use this construct? What would then be the > best way? > Darius > > <<example>> > > unit MyTest; > > {$mode objfpc}{$H+} > > interface > > uses > Classes, ComCtrls, SysUtils; > > type > TCustomClass = class > private > //virtual mehods > function GetMyProperty: string; virtual; abstract; > procedure SetMyProperty(Value: string); virtual; abstract; > published > > property MyProperty: string Read GetMyProperty Write SetMyProperty; > end; > > TMyClass = class(TCustomClass) > private > FMyProperty: string; > > function GetMyProperty: string; overload; > procedure SetMyProperty(Value: string); overload; > published > property MyProperty; > end; > > implementation > > function TMyClass .GetMyProperty: string; > begin > Result := FMyProperty; > end; > > procedure TMyClass .SetMyProperty(Value: string); > begin > if Value = FMyProperty then > exit; > > FMyProperty := Value; > end; > end. > > > > _______________________________________________ > fpc-pascal maillist - > http://lists.freepascal.org/mailman/listinfo/fpc-pascal > Try override instead of overload -- Rodrigo Palhano --------------------------------- Equipe SpeedCASE _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply by email