如何在扩展活动中声明扩展模型类?

时间:2017-01-31 10:29:38

标签: java android

我有一个Android应用程序来协助收集动物观察数据。它有一个活动ObserveAnimal和一个带有正常getter和setter的模型Animal。

我正在创建一个不同风格的应用程序,具有扩展功能和鸟类观察的扩展数据。 ObserveBird扩展了ObserveAnimal,Bird扩展了Animal。 ObserveBird增加了一些额外的方法。

public class Animal {
    private String species;
    // there are more fields and public getters and setters ...
}

public class Bird extends Animal {
    private int wingLength;
    // public getters and setters ...
}

问题是我找不到正确的方式来声明和初始化Bird。我试过几种方法,比如:

public class ObserveAnimal extends AppCompatActivity {
    protected Animal a = new Animal();
}

public class ObserveBird extends ObserveAnimal {
    protected Bird a = new Bird();
}

ObserveAnimalAnimal a可以很好地协同工作。

但是在ObserveBird中,Bird a声明隐藏了Animal a声明,最终我得到了两个不同的实例。实例Animal aspecies中的代码获取其ObserveAnimal字段集,实例Bird awingLength中的代码中获取其ObserveBird字段集。

我正在尝试在Bird a中设置一个ObserveBird的{​​{1}}个实例,species中的代码设置为ObserveAnimalwingLength设置ObserveBird {1}}。

当我开始活动Bird a时,我想要一个实例Animal(而不是ObserveBird的其他实例)。

如果不重复从ObserveAnimal到ObserveBird的大量代码,我该怎么做?

2 个答案:

答案 0 :(得分:1)

  

如果不重复从ObserveAnimal到ObserveBird的大量代码,我该怎么做?

您最有可能从使用abstract class中受益,而逻辑Animal应该是这样的类,Bird应该只是扩展Animal。这样,常见的代码和逻辑就会与Animal

保持一致

修改

我创建了Animal和Birt必须实现的接口(即AnimalContract)或者首先为我的模型设置抽象基类:

public class Animal implements AnimalContract {
    private String species;
   // there are more fields and public getters and setters ...
}

public class Bird extends Animal {
    private int wingLength;
    // public getters and setters ...
}

然后,当我需要任何动物时,无论是鸟,狗还是我想要的任何东西AnimalContract,同时仍然能够要求某些物种(即{明确需要时{1}}。

然后我会为观察事物提供基类:

Bird

并调用abstract public class ObserveBase extends AppCompactActivity { abstract AnimalContract getModel(); protected AnimalContract a; protected void init() { a = getModel(); } ... all the common code here... } (或与init()合并)。接下来我将onCreate()返回我的模型,类似于子类:

getModel()

public class ObserveAnimal extends ObserveBase {
    @Override
    public AnimalContract getModel() {
       return new Animal();
    }
}

答案 1 :(得分:-1)

这样的东西
public class Observe<A extends Animal> extends AppCompatActivity {
    protected A a;
    public Observe(Class<A> clazz) {
        a = clazz.newInstance();
    }
}

然后致电

Observe<Animal> animalActivity = new Observe<Animal>(Animal.class);
Observe<Bird> birdActivity = new Observe<Bird>(Bird.class);