![](/img/trans.png)
[英]how to call getResouces() in a class that is not extended Activity?
[英]How to declare extended model class in extended activity?
我有一個Android應用程序可協助收集動物觀察數據。 它具有一個活動ObserveAnimal和一個具有正常吸氣劑和吸氣劑的動物模型。
我正在使用擴展功能和用於鳥類觀察的擴展數據來創建應用程序的另一種風格。 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
從ObserveAnimal
的代碼獲取其species
字段集,實例Bird a
從ObserveBird
的代碼獲取其wingLength
字段集。
我想有一個實例Bird a
在ObserveBird
與species
從代碼中設置ObserveAnimal
和wingLength
從代碼中設置ObserveBird
。
啟動活動ObserveBird
時,我想要一個Bird a
實例(而不是Animal
其他實例)。
我如何做到這一點而又不從ObserveAnimal到ObserveBird復制很多代碼?
我如何做到這一點而又不從ObserveAnimal到ObserveBird復制很多代碼?
您很可能會從使用抽象類中受益,並且按照邏輯, 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
,同時仍然能夠要求某些物種(即明確需要時為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();
}
}
和
public class ObserveBird extends ObserveBase {
@Override
public AnimalContract getModel() {
return new Bird();
}
}
就像是
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.