August 02, 2003
Walter,
been trying to use abstract classes to implement my templated module for
automatic QueryInterface generation .....
BUT
is there a reason that an abstract class can no have methods

import com;

abstract class L8ComObject : ComObject, IClassFactory {
  extern(Windows):
  HRESULT QueryInterface(IID* riid, void** ppv) {
   return E_NOTIMPL;
  }
 }

causes the error
testif1.d(6): function QueryInterface abstract functions cannot have bodies

and

import com;

abstract class L8ComObject : ComObject, IClassFactory {
 }

testif2.d: class L8ComObject interface function IClassFactory.CreateInstance
is
not implemented

surely abstract classes can have methods, but never be instantated, and I
see no reason why I can not have an abstract class than implements an
interface etc ....
this basically forces me to use concrete classes if implementing interfaces
with some default function (that just returns E_NOTIMPL)
seems to me the compiler can create one method that does than and fill all
the vtbls for me a lot easier than me doing it in my base class, and then
HRESULT func( params) { return super.func( params); }
in every class until the one that actually has any real code, which will
mean my templates will create 100's of copies of the same func and loads of
vtbls
or everytime I want to create a COM interface I have to c'n'p my
QueryInterface and run the usual risks of errors, with worst being that I
have
  if ( *riid == IID_ISomethingIdontImplement ) {
   *ppv = (ISomethingIdontImplement)this;
   AddRef();
   return S_OK;
  }
which will return null in ppv .... arrgh! robustness out the window in one
hit.
I know I can use assert( !((rv == S_OK)&&(*ppv == null)) ) as an out
condition but that requires good correct testing of the debug version and
may not show up for sometime.