Am So., 6. Jan. 2019, 11:42 hat denisgolovan <denisgolo...@yandex.ru> geschrieben:
> Hi all > > I've been using 3.1.1 compiler for a long time and now I am trying to > upgrade to 3.3.1 from trunk. > However, I am stuck with some new behavior when using classes + interfaces. > I've managed to reproduce it in a small example which follows. > > Specifically 3.1.1 compiler compiles it and correctly prints "Double". > 3.3.1 compiler refuses to compile it at all. > Please comment if it's a bug or a new breaking feature. > > //================================================================== > program project1; > > {$mode objfpc}{$H+} > > uses > {$IFDEF UNIX}{$IFDEF UseCThreads} > cthreads, > {$ENDIF}{$ENDIF} > Classes > { you can add units after this }; > > type > IIntf1 = interface > procedure P(i:Integer); > end; > > TClass1 = class(TInterfacedObject, IIntf1) > procedure P(i:Integer); > end; > > IIntf2 = interface(IIntf1) > procedure P(f:Double); > end; > > TClass2 = class(TClass1, IIntf2) // Error: No matching implementation > for interface method "P(LongInt);" found > procedure P(f:Double); > end; > > procedure TClass1.P(i:Integer); > begin > WriteLn('Integer'); > end; > > procedure TClass2.P(f:Double); > begin > WriteLn('Double'); > end; > > var v2:TClass2; > begin > v2:=TClass2.Create; > v2.P(0.0); > v2.Free; > end. > The default visibility for classes without $M+ is private. Thus TClass1.P is private. An interface implementation does not have access to private methods of a parent class. So you need to declare P as protected for this to work. Though to be fair in the specific example you gave I think that it should work as both are within the same unit. We'll need to check that... Regards, Sven >
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal