[chuck-users] inheritance question
Voytek Lapinski
voytekl at octobit.com.au
Mon Jan 23 02:18:40 EST 2017
Hi All,
Just getting into ChucK and have a language question.
I have some base classes which I have written and am struggling with how
to get the inheritance to do what I want.
I have a class Voice, and a class Polysynth which contains an array of
Voices as data, like so:
public class Polysynth {
{
Voice voices[];
// methods which work on the objects in 'voices',
// ..
}
I want to be able to set up a patch which defines (for example) a
MySynth_Voice (subclassing Voice) and MySynth (subclassing Polysynth).
MySynth objects will thus contain an array of Mysynth_Voice objects. I
want to then be able to call methods on MySynth that are defined in
Polysynth, that uses the array of MySynth_Voices as data. The problem
is, because they are expecting Voice objects, they aren't happy to
receive MySynth_Voices instead (even though MySynth_Voice inherits from
Voice). I can't cast them in the Polysynth methods that use it because
it won't compile unless 'voices' is declared. It has to be declared as
'Voice', and if I try to override it in the subclass (eg. "MySynth_Voice
voices[]"), it won't compile saying saying it "has already been defined
in super class 'Polysynth'".
I tried a bunch of different ways to do this, but the only way I can
find to do it was to cast the voices array in the subclass as follows.
class MySynth extends Polysynth
{
fun void init (int num_voices) {
MySynth_Voice voices_temp[num_voices];
Voice voices_temp2[num_voices];
for (0=>int i; i < num_voices; i++) {
voices_temp[i] $ Voice @=> voices_temp2[i];
}
voices_temp2 @=> voices;
}
}
Firstly, is it possible to do this without having to do this casting
bit? It seems like a common inheritance set up, so am wondering if I
have just missed something. Failing that, is there a better way to do
the casting step? I tried to do in obvious ways like 'MySynth_Voice $
Voice[] @=> voices' but that, and other possible permutations I could
think of, wouldn't compile. The iterating over the whole array and doing
each member explicitly seemed to be the only thing that worked.
It's certainly no big deal and I can live with it, but am just curious
if there's a nicer way to do it.
Thanks all...
-voytek
More information about the chuck-users
mailing list