2 Questions: Do I need an interface & C++ -> D code part, how?
Daniel Keep
daniel.keep.lists at gmail.com
Sat May 19 04:56:44 PDT 2007
Benjamin Schulte wrote:
> Hi,
>
> I've got two questions about D - all containing those class structure:
>
> ...
>
> now my first question:
> I've got another class, called MyApplication - I want to have class Application as base class and MainLoopEvent as 2nd base class. So I wrote:
>
> class MyApplication : Application, MainLoopEvent { }
>
> But I got an error, that MainLoopEvent has to be an interface. Is there now another way than saying:
D only has single inheritance; you cannot inherit from multiple base
classes. Instead, the normal practice is to inherit from one base class
and many interfaces.
> ---------------
> 2nd question:
>
> MainLoopEvent has the method onMainLoop( );
> Say we create a second class with Event as Base class
>
> class AnotherEvent : Event
> {
> abstract void onBeingHappy( int a, int b );
> }
>
> Now, now I need a new function. In C++ I could write a macro: (I mixed C++ with D to show you what I mean:)
>
> #define callEvent(classType,event) foreach(Event e; event.getEventList() ) ((classType*)e)
I imagine the macro would not have been quite so easy to read had it
been written for C++ :P
> I could now just call
> callEvent(MainLoopEvent, myApplication)->onMainLoop( );
> callEvent(AnotherEvent, myEvent)->onBeingHappy( 12, 31 );
>
> At the moment my solution for MainLoopEvent looks like this:
> static void callMainLoop( )
> {
> // Call main loop event
> foreach( MainLoopEvent e; events ) e.onMainLoop( );
> }
>
> But that's not my favorite way to do this, because I would have to rewrite this for every abstract method.
>
> Might have some bugs in here, but I hope you understand what I mean. A template that calls methods I don't really know from the structure.
You could try something like this:
void callEvent(EventType, DgType)(DgType dg)
{
foreach( e ; events )
if( auto mle = cast(EventType)e )
dg(mle);
}
callEvent!(MainLoopEvent)((MainLoopEvent e){e.onMainLoop();});
It's hard to suggest what to do since I'm not 100% sure what you're
trying to accomplish. Looking at D from a C++ perspective is tricky
since D is *not* C++, nor is it descended from it.
If you're doing GUI code, you might want to look at DFL
(http://www.dprogramming.com/dfl.php) which might give you some ideas on
how to do event callbacks.
For instance, I wouldn't bother with classes myself, I'd just use
delegates, or the Signal and Slot stuff in std.signals. Like I said,
have a poke around, and keep in mind that D is not a superset of C++, so
there will be things you can't directly translate (like multiple
inheritance). Anything in C you can generally assume behaves in roughly
the same way, but outside of that, be careful.
-- Daniel
--
int getRandomNumber()
{
return 4; // chosen by fair dice roll.
// guaranteed to be random.
}
http://xkcd.com/
v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D
i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/
More information about the Digitalmars-d
mailing list