> On Dec 27, 2019, at 1:39 PM, Adriaan van Os <f...@microbizz.nl> wrote:
> 
> etcetera. The disadvantage of this approach is that for example a default 
> DoKeyCommand must be written three times, for TApplication, TDocument and 
> TView, where the code for TDocument.DoKeyCommand and TView.DoKeyCommand is 
> identical.
> 
> Identical code is clumsy. Therefore my wish that a helper object could 
> somehow be put in the namespace of the importing object, including the 
> ability to override the imported methods. I hope that answers you question.

This makes perfect sense to me but see what Sven says. I've encountered this 
same problem many times over the years where you want code modularity but can't 
use inheritance. There is absolutely a need for this syntax in my opinion and 
that fact Apple is holding developer conferences over it further shows this 
(https://developer.apple.com/videos/wwdc/2015/?id=408). 

The interface delegation has so much boiler plate and doesn't help with the 
namespace issues so I'm not sure why it's better then making your TQDGraphPort 
and TEventHandler records and just including them as fields in the main class. 
I think they were designed for some other pattern that I'm not familiar with 
myself. The idea of traits/aspects is similar but falls under the umbrella of 
class composition as an alternative to inheritance.

The article I posted before 
(http://machinethink.net/blog/mixins-and-traits-in-swift-2.0/) actually has 
some good use case examples including pretty charts and pictures. Swift uses 
protocol extensions to accomplish "Protocol-Oriented Programming" which would 
be the equivalent of interface helpers in Object Pascal. We can't use fields in 
interfaces or helpers though so this won't work for us I'm afraid.

program mixin;

type
  IBrain = interface
    procedure Eat;
  end;

type
  IPhysics = interface
    procedure Apply;
  end;

type
  TPhysicsHelper = interface helper for IPhysics
    procedure Apply;
  end;

procedure TPhysicsHelper.Apply;
begin
  // ... we can't add fields in helpers or interfaces!
end;

type
  TPerson = class(IBrain, IPhysics)
  end;

begin
  // calls TPhysicsHelper.Apply via the IPhysics interface in TPerson
  person.Apply;
end.

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to