Thanks Dennis. I take it this all means I can do the following and still have a valid pointer inside my DoSomething() method. Great!
> > DoSomething(AObject : IFirstDescendant); > > and > > TNewClass = class(TInterfacedObject,ISecondDescendant); > > > > procedure Test; > > var > > MyObject : ISecondDescendant; > > begin > > MyObject := TNewClass.Create; > > DoSomething(MyObject); > > end; ----- Original Message ----- From: "Dennis Chuah" <[EMAIL PROTECTED]> To: "Multiple recipients of list delphi" <[EMAIL PROTECTED]> Sent: Tuesday, June 17, 2003 8:43 AM Subject: Re: [DUG]: Interface Inheritance > > Let me simplify your example: > > type > TNewClass = class(TInterfacedObject,ISecondDescendant); > > var > First: IFirstDescendant; > Second: ISecondDescendant; > > Second := TNewClass.Create; // Line 1 > First := Second; // Line 2 > > The above compiles and works fine. Line 1 actually performs 2 operations: > > 1. o := TNewClass.Create, where o is a temp var of type TNewClass > 2. Second := o > > Contrary to popular belief, the second operation does not call > QueryInterface. Instead, at compile time, the interface reference is bound > to the object reference. This is because at compile time, the interface > reference is always a known offset from the object reference (see my last > long post). > > To see this you can either look at the compiled code, or remove the GUID > from your interface declaration. Without a GUID, the second operation still > works, whereas, if the second operation was: > > Second := o as ISecondDescendent, > > without a GUID will raise a compile time error. > > Line 2 also works because ISecondDescendent implements all methods of > IFirstDescendents and are therefore assignment compatible. The important > point here is they are assignment compatible, but they are different. > > However, if you do: > > First := Second as IFirstDescendent > > you will get an exception EIntfCastError. This is because the "as" operator > calls QueryInterface on Second, and TNewClass does not support > IFirstInterface. > > Regards, > Dennis. > > ----- Original Message ----- > From: "Todd Martin" <[EMAIL PROTECTED]> > To: "Multiple recipients of list delphi" <[EMAIL PROTECTED]> > Sent: Monday, June 16, 2003 1:46 PM > Subject: Re: [DUG]: Interface Inheritance > > > > Hi Guys. > > > > Thanks for all the feedback. I didn't realise it would get so much > response. > > In the end I decided to go with the following : > > IFirstDescendant = interface(IInterface); > > ISecondDescendant = interface(IFirstDescendant); > > > > TNewClass = class(TInterfacedObject,IFirstDescendant ,ISecondDescendant); > > > > However I noticed one very peculiar aspect of interfaces along the way > when > > compiling. > > > > If I define a procedure > > DoSomething(AObject : IFirstDescendant); > > and > > TNewClass = class(TInterfacedObject,ISecondDescendant); > > > > and then the following code compiles okay > > > > procedure Test; > > var > > MyObject : ISecondDescendant; > > begin > > MyObject := TNewClass.Create; > > DoSomething(MyObject); > > end; > > > > I haven't checked yet, but I'm assuming the MyObject passed through to > > procedure DoSomething() is then "nil", since TNewClass doesn't support > > IFirstDescendant. Would that be your guess too? So why does it compile? On > > the otherhand, does the ISecondDescendant pointer get sucessfully > converted > > to a IFirstDescendant pointer, in which case, why does > > MyObject.QueryInterface(IFirstDescendant,FirstObject) return a "nil" > pointer > > to FirstObject? > > > > However, if I define > > IFirstDescendant = interface(IInterface); > > ISecondDescendant = interface(IInterface); > > > > ie. no interface inheritance - (or whatever you want to call it) > > and > > > > TNewClass = class(TInterfacedObject,IFirstDescendant,ISecondDescendant); > > > > the Test() procedure does not compile. Any comments? > > > > Thanks. > > > > ----- Original Message ----- > > From: "Conor Boyd" <[EMAIL PROTECTED]> > > To: "Multiple recipients of list delphi" <[EMAIL PROTECTED]> > > Sent: Monday, June 16, 2003 10:31 AM > > Subject: RE: [DUG]: Interface Inheritance > > > > > > > There are a lot of people (including me) who never use the term > 'interface > > > inheritance'. You're right, it's not inheritance. > > > > > > As an aside, having had the 'chance' recently to go some VB6 coding > :-( I > > > found the Microsoft documentation utterly misleading when it talks about > > > interface inheritance, when IMO it should be talking about 'interface > > > implementation', which is probably a phrase which is also appropriate to > > > what we're talking about here. > > > > > > Cheers, > > > > > > Conor > > > > > > -----Original Message----- > > > From: Karl Reynolds [mailto:[EMAIL PROTECTED] > > > > > > > So this is one simple case where you have IStream inheriting > > > > from ISequentialStream (see ActiveX.pas) but you are not required > > > > to implement ISequentialStream is you are implementing IStream. > > > > > > Utterly bizarre. I get your point - that interface "inheritance" has to > > be > > > implemented the way it is in Delphi in order to support such > strangeness. > > > But it's not really inheritance any more, is it. > > > > -------------------------------------------------------------------------- > > - > > > New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED] > > > Website: http://www.delphi.org.nz > > > To UnSub, send email to: [EMAIL PROTECTED] > > > with body of "unsubscribe delphi" > > > Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/ > > > > > > > > > -------------------------------------------------------------------------- > - > > New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED] > > Website: http://www.delphi.org.nz > > To UnSub, send email to: [EMAIL PROTECTED] > > with body of "unsubscribe delphi" > > Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/ > > > -------------------------------------------------------------------------- - > New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED] > Website: http://www.delphi.org.nz > To UnSub, send email to: [EMAIL PROTECTED] > with body of "unsubscribe delphi" > Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/ --------------------------------------------------------------------------- New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED] Website: http://www.delphi.org.nz To UnSub, send email to: [EMAIL PROTECTED] with body of "unsubscribe delphi" Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/
