I have two classes, Foo
and Bar
, and an Algorithm
class that uses both.
class Foo {
void method(Bar bar) {
bar.otherMethod();
...
}
}
class Bar {
void method() {
...
}
void otherMethod() {
...
}
}
class Algorithm {
void run(Foo foo, Bar bar) {
foo.method(bar);
bar.method();
...
}
}
The algorithm part (run
method) is generic, and I want to be able to reuse it in other projects, involving classes analogue to Foo
and Bar
, which I know will each have the methods named method
. However, I do not want to put the Bar.otherMethod
at interface level (because it is not a generic functionality).
For this reason, I defined two interfaces:
interface IFoo {
void method(IBar bar);
}
and
interface IBar {
void method();
}
and changed the signature of Algorithm.run()
into void run(IFoo foo, IBar bar)
, in order to use these interfaces.
The problem is that now, in the Foo
class I have to make a cast in order to use specific aspects from the Bar
class.
class Foo implements IFoo {
void method(IBar bar) {
(Bar)bar.otherMethod();
...
}
}
In general, this cast is an indicator of bad design. Is there indeed a problem? What would be a better approach for my intention of having a generic Algorithm.run()
method?
Aucun commentaire:
Enregistrer un commentaire