[DUG] Interfaces

Alister Christie alister at salespartner.co.nz
Fri Aug 8 12:09:22 NZST 2008


Okay here is my second bit of confusion cleared up regarding interface 
inheritance.
If I declare the following types
Type
  INoiseable = interface
    ['{B7A2C437-EC4C-485D-B7E2-CD085E8414BE}']
    procedure MakeNoise;
  end;
  ISpeakable = interface(INoiseable)
    ['{E789E48D-4105-4181-B644-96B94F27E48A}']
    procedure Speak;
  end;
  TPerson = class(TInterfacedObject, ISpeakable)
    procedure MakeNoise;
    procedure Speak;
  end;

procedure TPerson.MakeNoise;
begin
  showMessage('Some Noise');
end;

procedure TPerson.Speak;
begin
  ShowMessage('Some Speach')
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  Person : TPerson;
  Speakable : ISpeakable;
begin
  Speakable := TPerson.Create;
  (Speakable as INoiseable).MakeNoise; //this fails - TPerson does not 
support INoiseable - eventhough it inherits from ISpeakable
  (Speakable as ISpeakable).MakeNoise; //this is fine
end;

However if I change my TPerson to the following
  TPerson = class(TInterfacedObject, ISpeakable, INoiseable)
then all is happy.  I don't quite understand fully why as yet - I guess 
you can't get an interface pointer to an object unless it explicitly 
states that it supports that interface.

Alister Christie
Computers for People
Ph: 04 471 1849 Fax: 04 471 1266
http://www.salespartner.co.nz
PO Box 13085
Johnsonville
Wellington 



Alister Christie wrote:
> No,
>
> There is some other stuff that is confusing me also to do with interface 
> inheritance - I think I'm going to have to do some reading.
>
> Alister Christie
> Computers for People
> Ph: 04 471 1849 Fax: 04 471 1266
> http://www.salespartner.co.nz
> PO Box 13085
> Johnsonville
> Wellington 
>
>
>
> Todd Martin wrote:
>   
>> Hi Alister
>>
>> Are you implementing IXMLResidentialType via delegation?
>>
>> Todd.
>>   
>>     
>>> I'm having some fun with interfaces
>>>
>>> I have two interfaces IXMLResidentialType and IAuctionable.
>>> I have a class which implements these two interfaces
>>> TXMLResidentialType = class(TXMLNode, IXMLResidentialType, IAuctionable) 
>>> ...
>>>
>>> I have some code
>>> var
>>>   Res : IXMLResidentialType;
>>>   Auctionable : IAuctionable;
>>> begin
>>> ...
>>>   if Res.QueryInterface(IAuctionable, Auctionable) = 0 then
>>>     ShowMessage('Auctionable');
>>>
>>> What I'm trying to determine is if Res implements IAuctionable - which 
>>> it does (through TXMLResidentialType which effective Res is an instance 
>>> of), however IXMLResidentialType doesn't seem to realise this.  How do I 
>>> make this work?
>>>
>>> Does this question make any sense?
>>>
>>> If I'm not able to do this it's not too much of a problem, but will mean 
>>> a bunch of duplicated code.
>>>
>>>
>>>   
>>>     
>>>       
>> _______________________________________________
>> NZ Borland Developers Group - Delphi mailing list
>> Post: delphi at delphi.org.nz
>> Admin: http://delphi.org.nz/mailman/listinfo/delphi
>> Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject: unsubscribe
>>
>>   
>>     
>
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: delphi at delphi.org.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject: unsubscribe
>
>   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserver.123.net.nz/pipermail/delphi/attachments/20080808/317c62d4/attachment.html 


More information about the Delphi mailing list