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








"Mike Wynn" <mike.wynn l8night.co.uk>