D - 2.0: Automatic interfaces?
- Russ Lewis (42/42) Mar 18 2004 In the discussion above about multiple inheritance, I pointed out how it...
- Matthew (10/52) Mar 19 2004 This could be the nexus of the mixins solution. How about
In the discussion above about multiple inheritance, I pointed out how it
can be useful to have an interface which mirrors a given class, so that
you can do MI by hand:
class A {...}
interface B_interface {...}
class B,B_interface {...}
/* class C is (sort of) an MI mix of A and B */
class C : A,B_interface {
B b;
/* create wrappers for b's fields by hand here */
}
But then the programmer has to do dual maintainence, keeping B_interface
synchronized with B. Plus, the code is harder to read, since you have
variables of type B_interface (rather than B) floating around.
By why not have the compiler automatically generate a type "interface
B", which is an interface which has the same implementation as B?
class A {...}
class B {...} /* no explicit interface */
class C : A,interface B {
B b;
/* same wrappers */
}
Of course, if this was legal, then this would also be a conceivable
implementation for C:
class C : B,interface A {
A a;
/* wrappers for A */
}
Of course, now you have to ask what this variable represents:
A a;
Is it a reference to A, or a reference to interface A? If the former,
then you could use the data members of A; if the latter, then you could
use only the methods.
I would suggest that
A a;
should be a reference to interface A, and that
class A a;
should be a reference to A. I think that this is a good idea because it
allows maximum portability (the variable a can be assigned references to
a wider range of types). Users who need a slight performance boost or
who want to access data directly (not through properties) can use the
slightly more verbose syntax.
Mar 18 2004
This could be the nexus of the mixins solution. How about
class C
: A
, mixin B
{
mixin B b;
}
?
"Russ Lewis" <spamhole-2001-07-16 deming-os.org> wrote in message
news:c3dqud$31do$1 digitaldaemon.com...
In the discussion above about multiple inheritance, I pointed out how it
can be useful to have an interface which mirrors a given class, so that
you can do MI by hand:
class A {...}
interface B_interface {...}
class B,B_interface {...}
/* class C is (sort of) an MI mix of A and B */
class C : A,B_interface {
B b;
/* create wrappers for b's fields by hand here */
}
But then the programmer has to do dual maintainence, keeping B_interface
synchronized with B. Plus, the code is harder to read, since you have
variables of type B_interface (rather than B) floating around.
By why not have the compiler automatically generate a type "interface
B", which is an interface which has the same implementation as B?
class A {...}
class B {...} /* no explicit interface */
class C : A,interface B {
B b;
/* same wrappers */
}
Of course, if this was legal, then this would also be a conceivable
implementation for C:
class C : B,interface A {
A a;
/* wrappers for A */
}
Of course, now you have to ask what this variable represents:
A a;
Is it a reference to A, or a reference to interface A? If the former,
then you could use the data members of A; if the latter, then you could
use only the methods.
I would suggest that
A a;
should be a reference to interface A, and that
class A a;
should be a reference to A. I think that this is a good idea because it
allows maximum portability (the variable a can be assigned references to
a wider range of types). Users who need a slight performance boost or
who want to access data directly (not through properties) can use the
slightly more verbose syntax.
Mar 19 2004








"Matthew" <matthew stlsoft.org>