D - Interfaces that are not "COM" cause "Error: Access Violation"
the code at the end of posting compiles but when run causes Error: Access Violation however ... if callLayout was defined as void callLayout( CanLayout cl ) { cl.doLayout(); } it works (the compiler knows BaseLayout implements CanLayout [in main]) as does void callLayoutInd(CanLayout cl) { if ( cl ) { cl.doLayout(); } else { println( "the 'Base' you passed did not implement 'CanLayout'" ); } } void callLayout( Base b ) { callLayoutInd( cast(BaseLayout)b ); } is this intended "interface" behaviour ? [have I missed a big point with D interfaces?] (would wish for a more "Java" interface). ------------------ // // interface test 001 // import c.stdio; void println( char[] str ) { printf( "%.*s\n", str ); } interface CanLayout { void doLayout(); } class Base { void print() { println("Base::print"); } } class BaseLayout : Base, CanLayout { void doLayout() { println( "BaseLayout::doLayout" ); } } void callLayout( Base b ) { CanLayout cl = cast(CanLayout)b; if ( cl ) { cl.doLayout(); } else { println( "the 'Base' you passed did not implement 'CanLayout'" ); } } int main( char[][] args ) { callLayout( new BaseLayout() ); return 0; }
Aug 15 2003
Yes, it's intended to work that way, although I'll investigate why there's a crash rather than just getting a null pointer. "Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:bhil4u$2hj6$1 digitaldaemon.com...the code at the end of posting compiles but when run causes Error: Access Violation however ... if callLayout was defined as void callLayout( CanLayout cl ) { cl.doLayout(); } it works (the compiler knows BaseLayout implements CanLayout [in main]) as does void callLayoutInd(CanLayout cl) { if ( cl ) { cl.doLayout(); } else { println( "the 'Base' you passed did not implement 'CanLayout'" ); } } void callLayout( Base b ) { callLayoutInd( cast(BaseLayout)b ); } is this intended "interface" behaviour ? [have I missed a big point with D interfaces?] (would wish for a more "Java" interface). ------------------ // // interface test 001 // import c.stdio; void println( char[] str ) { printf( "%.*s\n", str ); } interface CanLayout { void doLayout(); } class Base { void print() { println("Base::print"); } } class BaseLayout : Base, CanLayout { void doLayout() { println( "BaseLayout::doLayout" ); } } void callLayout( Base b ) { CanLayout cl = cast(CanLayout)b; if ( cl ) { cl.doLayout(); } else { println( "the 'Base' you passed did not implement 'CanLayout'" ); } } int main( char[][] args ) { callLayout( new BaseLayout() ); return 0; }
Aug 15 2003
"Walter" <walter digitalmars.com> wrote in message news:bhj2rf$2tm2$1 digitaldaemon.com...Yes, it's intended to work that way, although I'll investigate why there'sacrash rather than just getting a null pointer.why can't I cast an instance of BaseLayout (passed as Base) to an interface it implements ? this behaviour makes D even more restricive to use than Java, and seems to contradict the whole idea of interfaces (a set of methods any Object can implement) allowing limited MI like behavious."Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:bhil4u$2hj6$1 digitaldaemon.com...Dthe code at the end of posting compiles but when run causes Error: Access Violation however ... if callLayout was defined as void callLayout( CanLayout cl ) { cl.doLayout(); } it works (the compiler knows BaseLayout implements CanLayout [in main]) as does void callLayoutInd(CanLayout cl) { if ( cl ) { cl.doLayout(); } else { println( "the 'Base' you passed did not implement 'CanLayout'" ); } } void callLayout( Base b ) { callLayoutInd( cast(BaseLayout)b ); } is this intended "interface" behaviour ? [have I missed a big point withinterfaces?] (would wish for a more "Java" interface). ------------------ // // interface test 001 // import c.stdio; void println( char[] str ) { printf( "%.*s\n", str ); } interface CanLayout { void doLayout(); } class Base { void print() { println("Base::print"); } } class BaseLayout : Base, CanLayout { void doLayout() { println( "BaseLayout::doLayout" ); } } void callLayout( Base b ) { CanLayout cl = cast(CanLayout)b; if ( cl ) { cl.doLayout(); } else { println( "the 'Base' you passed did not implement 'CanLayout'" ); } } int main( char[][] args ) { callLayout( new BaseLayout() ); return 0; }
Aug 15 2003