09.01.2011 15:22, %u пишет:
== Quote from bearophile (bearophileh...@lycos.com)'s article
%u:
   func(cast(I2)(new C()));
That code smells a bit (http://en.wikipedia.org/wiki/Code_smell ).
Bye,
bearophile
Extract the construction and you get:

----
module main;

interface I1{}
interface I2 : I1{}

class C : I2{
   this(){}
}

void func(I1 i){}
void func(I2 i){}

void main(){
   C c = new C();
   func( cast(I2)c );
}
----

What is the deeper problem in this little snippet?
Or do you mean there is something wrong if you encounter this pattern.

I don't think it's really that much worse than renaming one(or both) of the 
funcs.
It forces you to cast all class:I2 objects to the func you want called, but all
class:I1 objects already call the correct func.

I think different named funcs is a better solution, but I don't think the cast
solution exemplifies a pattern of indication to a deeper problem.

In C++ I sometimes have similar problems, especially with multiple inheritance. Though, as Jonathan mentioned, those problems are even more annoying because of hijacking: you don't always immediately notice them. Long ago I've decided to always employ conversion methods for such cases, which in D might look like this:

class C : I2{
  I1 toI1() { return this; }
  I2 toI2() { return this; }
}

This unclutters the code a bit, i think:

void main(){
  func((new C).toI2()); // compare with func(cast(I2)(new C));
  C c = new C;
  func(c.toI1()); // compare with(cast(I1)c);
}

The calls to conversion methods could be even shorter if they were properties, because of omitted parens. Anyway, once I stuck to this strategy, it never failed me.

Reply via email to