你如何创建多个级别的子类以便参数是子类? [英] How do you create multiple levels of subclasses so that the parameters are of the subclasses?

查看:113
本文介绍了你如何创建多个级别的子类以便参数是子类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

继此 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆