Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
June 04, 2004 Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
I have interface Ifunc and class A implementing it. The bug occurs when casting A[] to Ifunc[] Here is the code to demonstrate it: <CODE START> import std.c.stdio; interface Ifunc { int func(); } class A: Ifunc { this(int x){this.x=x;} int anotherfunc(int x) { int y = 4; return x; } int func() { return x; } int x; } void funcX(Ifunc[] u) { foreach(Ifunc f;u) { printf("%d ",f.func()); } } int main ( char [] [] args ) { A[] arr; arr~=new A(1); arr~=new A(3); arr~=new A(7); arr~=new A(11); funcX(arr); getch(); return 1; } <CODE END> Or is this casting not suposed to be possible? I hope it should be possible :) I didn't mention it but the funcX prints Object <adress> pairs or something like that! |
June 06, 2004 Re: Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ivan Senji | The compiler should issue an error diagnostic on this. While you can convert a class to its base interface, that doesn't apply to arrays of classes. "Ivan Senji" <ivan.senji@public.srce.hr> wrote in message news:c9qv5i$23np$1@digitaldaemon.com... > I have interface Ifunc and class A implementing it. > The bug occurs when casting A[] to Ifunc[] > > Here is the code to demonstrate it: > > <CODE START> > import std.c.stdio; > > interface Ifunc > { > int func(); > } > > class A: Ifunc > { > this(int x){this.x=x;} > int anotherfunc(int x) > { > int y = 4; > return x; > } > int func() > { > return x; > } > int x; > } > > void funcX(Ifunc[] u) > { > foreach(Ifunc f;u) > { > printf("%d ",f.func()); > } > } > > int main ( char [] [] args ) > { > A[] arr; > arr~=new A(1); > arr~=new A(3); > arr~=new A(7); > arr~=new A(11); > > funcX(arr); > > getch(); > return 1; > } > <CODE END> > > Or is this casting not suposed to be possible? > I hope it should be possible :) > > I didn't mention it but the funcX prints > Object <adress> pairs or something like that! > > |
June 06, 2004 Re: Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | "Walter" <newshound@digitalmars.com> wrote in message news:c9u6vu$png$1@digitaldaemon.com... > The compiler should issue an error diagnostic on this. While you can convert > a class to its base interface, that doesn't apply to arrays of classes. Really? Isn't this something that is neaded? My class accepts an array of interfaces and now the user can't just pass his own classes array, but he has to manually convert an array of his class to an array of interfaces. It complicates the user code a lot. Is it not possible to implement this kind of conversion, or is it for some other reason not wise to have this? > "Ivan Senji" <ivan.senji@public.srce.hr> wrote in message news:c9qv5i$23np$1@digitaldaemon.com... > > I have interface Ifunc and class A implementing it. > > The bug occurs when casting A[] to Ifunc[] > > > > Here is the code to demonstrate it: > > > > <CODE START> > > import std.c.stdio; > > > > interface Ifunc > > { > > int func(); > > } > > > > class A: Ifunc > > { > > this(int x){this.x=x;} > > int anotherfunc(int x) > > { > > int y = 4; > > return x; > > } > > int func() > > { > > return x; > > } > > int x; > > } > > > > void funcX(Ifunc[] u) > > { > > foreach(Ifunc f;u) > > { > > printf("%d ",f.func()); > > } > > } > > > > int main ( char [] [] args ) > > { > > A[] arr; > > arr~=new A(1); > > arr~=new A(3); > > arr~=new A(7); > > arr~=new A(11); > > > > funcX(arr); > > > > getch(); > > return 1; > > } > > <CODE END> > > > > Or is this casting not suposed to be possible? > > I hope it should be possible :) > > > > I didn't mention it but the funcX prints > > Object <adress> pairs or something like that! > > > > > > |
June 06, 2004 Re: Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ivan Senji | Ivan Senji wrote:
>>The compiler should issue an error diagnostic on this. While you can
>
> convert
>
>>a class to its base interface, that doesn't apply to arrays of classes.
>
>
> Really? Isn't this something that is neaded?
> My class accepts an array of interfaces and now
> the user can't just pass his own classes array, but
> he has to manually convert an array of his class to
> an array of interfaces.
> It complicates the user code a lot.
>
> Is it not possible to implement this kind of conversion,
> or is it for some other reason not wise to have this?
This is an old problem. Some languages allow it, others don't.
It is rooted in type-safety constraints. Here's an example:
class Base
{}
class Sub : Base
{}
Sub[] s=new Sub[10];
Base[] b;
//this is not allowed because a Base is not a Sub
s[0]=new Base();
//but if this was allowed
b=cast(Base[])s;
//then you can do this
b[0]=new Base();
//and since they are the same arrays, s[0] is not an instance of Sub //anymore, without the compiler being able to catch this bug.
Hauke
|
June 06, 2004 Re: Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Hauke Duden | "Hauke Duden" <H.NS.Duden@gmx.net> wrote in message news:c9utas$1nkc$1@digitaldaemon.com... > Ivan Senji wrote: > >>The compiler should issue an error diagnostic on this. While you can > > > > convert > > > >>a class to its base interface, that doesn't apply to arrays of classes. > > > > > > Really? Isn't this something that is neaded? > > My class accepts an array of interfaces and now > > the user can't just pass his own classes array, but > > he has to manually convert an array of his class to > > an array of interfaces. > > It complicates the user code a lot. > > > > Is it not possible to implement this kind of conversion, > > or is it for some other reason not wise to have this? > > This is an old problem. Some languages allow it, others don't. > > It is rooted in type-safety constraints. Here's an example: > > class Base > {} > > class Sub : Base > {} > > Sub[] s=new Sub[10]; > Base[] b; > > //this is not allowed because a Base is not a Sub > s[0]=new Base(); > > //but if this was allowed > b=cast(Base[])s; > > //then you can do this > b[0]=new Base(); > > //and since they are the same arrays, s[0] is not an instance of Sub //anymore, without the compiler being able to catch this bug. > Thanks! I see the problem now. Allowing this cast would be cool and helpfull sometimes but if it causes too much problems than it is probbably not a good idea :( PS. I just love this NG, you can ask all kinds of questions, and there is allways a good person out there to answer :) > > Hauke > |
June 06, 2004 Re: Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Hauke Duden | Problem solved: template cast2interfaceArr(A,B) { B[] cast2interfaceArr(A[] aa) { B[] b = new B[aa.length]; foreach(int index,inout A a; aa) { b[index] = a; } return b; } } and the user code thoesn't look that bad: somefunc(cast2interfaceArr!(MyClass,ISomeInterface)(myarray)); instead of: somefunc(myarray); But an error message must happen to as a warning to the user that the class array can not be passed directly! "Hauke Duden" <H.NS.Duden@gmx.net> wrote in message news:c9utas$1nkc$1@digitaldaemon.com... > Ivan Senji wrote: > >>The compiler should issue an error diagnostic on this. While you can > > > > convert > > > >>a class to its base interface, that doesn't apply to arrays of classes. > > > > > > Really? Isn't this something that is neaded? > > My class accepts an array of interfaces and now > > the user can't just pass his own classes array, but > > he has to manually convert an array of his class to > > an array of interfaces. > > It complicates the user code a lot. > > > > Is it not possible to implement this kind of conversion, > > or is it for some other reason not wise to have this? > > This is an old problem. Some languages allow it, others don't. > > It is rooted in type-safety constraints. Here's an example: > > class Base > {} > > class Sub : Base > {} > > Sub[] s=new Sub[10]; > Base[] b; > > //this is not allowed because a Base is not a Sub > s[0]=new Base(); > > //but if this was allowed > b=cast(Base[])s; > > //then you can do this > b[0]=new Base(); > > //and since they are the same arrays, s[0] is not an instance of Sub //anymore, without the compiler being able to catch this bug. > > > Hauke > |
June 07, 2004 Re: Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ivan Senji | "Ivan Senji" <ivan.senji@public.srce.hr> wrote in message news:ca05tf$e57$1@digitaldaemon.com... > Problem solved: > > template cast2interfaceArr(A,B) Arr, this be not International Talk Like A Pirate Day, me matey! Arr. |
June 07, 2004 Re: Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | "Walter" <newshound@digitalmars.com> wrote in message news:ca2dk6$qut$1@digitaldaemon.com... > > "Ivan Senji" <ivan.senji@public.srce.hr> wrote in message news:ca05tf$e57$1@digitaldaemon.com... > > Problem solved: > > > > template cast2interfaceArr(A,B) > > Arr, this be not International Talk Like A Pirate Day, me matey! Arr. > LOL! :) But seriously: i really can't figure out how to call it to make sence: castClassArray2InterfaceArray is a bit(not bool) too long! :) |
June 08, 2004 Re: Bug casting class[] to interface[] ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ivan Senji | "Ivan Senji" <ivan.senji@public.srce.hr> wrote in message news:ca2g8n$v71$1@digitaldaemon.com... > "Walter" <newshound@digitalmars.com> wrote in message news:ca2dk6$qut$1@digitaldaemon.com... > > > > "Ivan Senji" <ivan.senji@public.srce.hr> wrote in message news:ca05tf$e57$1@digitaldaemon.com... > > > Problem solved: > > > > > > template cast2interfaceArr(A,B) > > > > Arr, this be not International Talk Like A Pirate Day, me matey! Arr. > > > > LOL! :) > > But seriously: i really can't figure out how to call it to make sence: > castClassArray2InterfaceArray is a bit(not bool) too long! :) I guess that's the way it should be, though. |
Copyright © 1999-2021 by the D Language Foundation