Bagaimana cara mengakses nama sesuatu dalam daftar array saya yang merupakan daftar array tipe antarmuka saya?

Judulnya bertele-tele dan mungkin membingungkan tetapi saya tidak yakin bagaimana membuatnya lebih baik...Saya ingin dapat mengakses nilai dalam daftar array saya dan mencetaknya.

Saya memiliki antarmuka yang disebut ThingBagInterface. ThingBagInterface ini hanya memiliki satu metode, dan terlihat seperti ini:

interface ThingBagInterface {
    public String getType();
}

Saya sekarang memiliki kelas yang disebut ThingBag, itu adalah tas yang menampung banyak barang berbeda, seperti Makhluk, Bangunan, dll.

Di kelas ThingBag saya, saya telah menginisialisasi semua Makhluk saya seperti ini:

public void initCreatures(){
     waterSnake = new Creature("Water Snake", Terrain.SWAMP, false, false, false, false, 1, 0);
    etc...
}

dan kemudian saya memiliki fungsi populateBag() yang terlihat seperti ini:

public void populateBag(){
    initCreatures();

    bag.add(bears);
}

Definisi daftar array saya ada di ThingBag dan terlihat seperti ini:

ArrayList<ThingBagInterface> bag = new ArrayList<ThingBagInterface>();

Konstruktor Creature saya terlihat seperti ini:

    public Creature(String n, Terrain startTerrain, boolean flying, boolean magic, boolean charge, boolean ranged, int combat, int o){
        name = n;
        flyingCreature = flying;
        magicCreature = magic;
        canCharge = charge;
        rangedCombat = ranged;
        combatValue = combat;
        owned = o;
    }

Saya ingin mencetak nama beruang itu.

Jadi pada dasarnya saya melakukan ini:

ThingBag tb = new ThingBag();
tb.populateBag();
for(int i= 0; i<tb.bag.size(); i++){
    System.out.println(i+". "+tb.bag.get(i));
}

Mengapa saya tidak dapat mengakses nama di tas saya? Jika saya tidak menggunakan antarmuka, saya dapat mengatakan:

System.out.println(i+". "+tb.bag.get(i).name) 

Tapi aku tidak bisa sekarang. Adakah ide tentang bagaimana saya dapat mengakses nilai tersebut? Saya hanya dapat mengakses alamat memori sekarang...


person Sarah    schedule 28.01.2014    source sumber


Jawaban (3)


Variabel bag Anda dideklarasikan sebagai

ArrayList<ThingBagInterface> bag ...

Secara konseptual, ini berarti berisi setidaknya ThingBagInterface objek. Itu dapat berisi semua jenis ThingBagInterface, tetapi setidaknya harus ThingBagInterface.

Hal ini juga berarti bahwa kompiler hanya dapat menjamin bahwa kompiler tersebut berisi ThingBagInterface dan oleh karena itu Anda hanya dapat berinteraksi dengan elemen-elemennya sebagai instance ThingBagInterface.

name bukan bidang yang ada pada tipe ThingBagInterface, melainkan ada pada Creature.

Anda dapat memberikan nilai yang dikembalikan dari bag.get(i) atau mendeklarasikan metode getName() dari ThingBagInterface, mengimplementasikannya dalam sub tipe, dan memanggilnya dalam loop Anda.

person Sotirios Delimanolis    schedule 28.01.2014
comment
Terima kasih, ini pertama kalinya saya mencoba menggunakan antarmuka jadi saya akan membuat banyak kesalahan bodoh sampai saya benar-benar mengetahuinya. Terima kasih lagi. - person Sarah; 28.01.2014
comment
Perhatikan bahwa jika Anda ingin melemparkan elemen ke Creature, tidak ada banyak alasan untuk memiliki ThingBagInterface sama sekali. ArrayList<Creature> akan bekerja lebih baik. - person user2357112 supports Monica; 28.01.2014
comment
@Sarah Catat apa yang baru saja dikatakan pengguna2357112. Apakah Anda punya banyak ThingBagInterface? Apakah mereka semua memiliki name? Pertimbangkan untuk membuat kelas dasar untuk semuanya. - person Sotirios Delimanolis; 28.01.2014
comment
Mereka semua punya nama. Saya tidak yakin apakah saya benar-benar menginginkan antarmuka atau warisan. Saya memang memiliki daftar array Makhluk, tetapi saya perlu mengubahnya karena Daftar Array saya perlu menampung beberapa jenis hal yang berbeda. Mereka semua punya nama, jadi mungkin ke sanalah saya harus pergi, tapi hanya nama saja yang mereka punya kesamaan. - person Sarah; 28.01.2014

Anda harus mendesain antarmuka ThingBagInterface dengan lebih bijaksana. Apakah memiliki nama merupakan suatu persyaratan? Jika demikian, antarmuka memerlukan cara untuk mengakses nama objek. (Ini harus berupa metode, karena antarmuka tidak dapat menentukan kolom.) Sementara kita melakukannya, memilih nama yang lebih informatif daripada ThingBagInterface adalah ide yang bagus.

person user2357112 supports Monica    schedule 28.01.2014
comment
ini adalah antarmuka untuk tas yang menampung barang-barang yang merupakan nama bagian permainan untuk permainan papan yang saya coba terapkan, jadi cukup informatif, tapi saya mengerti apa yang ingin Anda katakan, jadi terima kasih - person Sarah; 28.01.2014
comment
@Sarah: Nama tidak memberikan informasi apa pun tentang hubungannya dengan ThingBag. Sepertinya ThingBag yang seharusnya mengimplementasikannya, bukan barang-barang yang ada di dalam tas. Bayangkan jika antarmuka penumpang di dalam mobil disebut CarInterface. - person user2357112 supports Monica; 28.01.2014

Mungkin melakukan pemeran seperti itu System.out.println(i+". "+(((Creature)tb.bag.)get(i));

Hal ini karena antarmuka tidak memiliki atribut nama. Ingat bidang dalam antarmuka selalu bersifat statis dan final publik secara implisit.

Semoga membantu.

person user_loser    schedule 28.01.2014