[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