我有一个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();
}
ObserveAnimal
和Animal a
可以很好地协同工作。
但是在ObserveBird
中,Bird a
声明隐藏了Animal a
声明,最终我得到了两个不同的实例。实例Animal a
从species
中的代码获取其ObserveAnimal
字段集,实例Bird a
从wingLength
中的代码中获取其ObserveBird
字段集。
我正在尝试在Bird a
中设置一个ObserveBird
的{{1}}个实例,species
中的代码设置为ObserveAnimal
,wingLength
设置ObserveBird
{1}}。
当我开始活动Bird a
时,我想要一个实例Animal
(而不是ObserveBird
的其他实例)。
如果不重复从ObserveAnimal到ObserveBird的大量代码,我该怎么做?
答案 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);