你如何创建多个级别的子类以便参数是子类? [英] How do you create multiple levels of subclasses so that the parameters are of the subclasses?
问题描述
继此 StackOverFlow问题比方说,我想扩大到另一个级别的子类,说马拉德,我该怎么做?
public abstract class Animal< A extends Animal< A>>
{
public abstract copyAnimal(A animal);
}
公共类Duck扩展了Animal< Duck>
{
@Override
public Duck copyAnimal(Duck duck)
{
return copyOfDuck;
}
}
类Mallard延伸Duck< Mallard>
{
public Mallard copyAnimal(Mallard mallard)
{
return copyOfMallard;
$ / code $ / pre
一切都很适合Duck子类,但是它失败了马拉德子亚类。我怎样才能用不确定数量的子类来设置它?解析方案
你只需要继续使用类型变量:
class Duck< D extends Duck< D>>延伸动物< D> {}
然后
class Mallard延伸Duck< Mallard> {
是的,这很杂乱!
<我经常看到这种模式与一个扩展的类的构建器一起使用,以创建一个子类的构建器。它使得代码乱七八糟,在我看来最好避免。
一个如何使用它的例子:
抽象类Animal< A extends Animal< A>> {
abstract A copyAnimal(A animal);
}
class Duck< D延伸Duck< D>>延伸动物< D> {
void quack(){}
copyAnimal(D duck){
duck.quack();
归还鸭子;
}
}
类Mallard延伸Duck< Mallard> {
野鸭copyAnimal(野鸭){
duck.quack();
归还鸭子;
}
}
Ideone demo (不做任何事;仅仅演示汇编)
Following this StackOverFlow question let's say I want to expand to another level of subclasses, say Mallards, how do I do it?
public abstract class Animal <A extends Animal<A>>
{
public abstract A copyAnimal(A animal);
}
public class Duck extends Animal<Duck>
{
@Override
public Duck copyAnimal(Duck duck)
{
return copyOfDuck;
}
}
class Mallard extends Duck<Mallard>
{
public Mallard copyAnimal(Mallard mallard)
{
return copyOfMallard;
}
}
Everything works great for the Duck subclass but it fails for the Mallard sub-subclass. How can I set this up with an undetermined number of subclasses?
You just keep going with the type variables:
class Duck<D extends Duck<D>> extends Animal<D> {}
then
class Mallard extends Duck<Mallard> {}
Yep, it's pretty messy!
I have most often seen this pattern used with a builder of a classes that is extended to create a builders of a subclass. It makes a total mess of the code, and in my opinion is best avoided.
An example of how to use it:
abstract class Animal<A extends Animal<A>> {
abstract A copyAnimal(A animal);
}
class Duck<D extends Duck<D>> extends Animal<D> {
void quack() {}
D copyAnimal(D duck) {
duck.quack();
return duck;
}
}
class Mallard extends Duck<Mallard> {
Mallard copyAnimal(Mallard duck) {
duck.quack();
return duck;
}
}
Ideone demo (does nothing; merely demonstrates compilation)
这篇关于你如何创建多个级别的子类以便参数是子类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!