簡體   English   中英

如何在擴展活動中聲明擴展模型類?

[英]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();
}

ObserveAnimalAnimal a應該很好地協同工作。

但是在ObserveBirdBird a聲明隱藏了Animal a聲明,而我最終得到了兩個不同的實例。 實例Animal aObserveAnimal的代碼獲取其species字段集,實例Bird aObserveBird的代碼獲取其wingLength字段集。

我想有一個實例Bird aObserveBirdspecies從代碼中設置ObserveAnimalwingLength從代碼中設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM