จะเข้าถึงชื่อของสิ่งต่าง ๆ ในรายการอาร์เรย์ของฉันซึ่งเป็นรายการอาร์เรย์ประเภทอินเทอร์เฟซของฉันได้อย่างไร

ชื่อเรื่องใช้คำมากและอาจทำให้สับสน แต่ฉันไม่แน่ใจว่าจะทำให้ดีขึ้นได้อย่างไร...ฉันต้องการเข้าถึงค่าในรายการอาร์เรย์ของฉันและพิมพ์ออกมา

ฉันมีอินเทอร์เฟซที่เรียกว่า ThingBagInterface ThingBagInterface นี้มีเพียงวิธีเดียวเท่านั้น และมีลักษณะดังนี้:

interface ThingBagInterface {
    public String getType();
}

ตอนนี้ฉันมีคลาสชื่อ ThingBag เป็นกระเป๋าที่บรรจุสิ่งของต่างๆ มากมาย เช่น สิ่งมีชีวิต สิ่งปลูกสร้าง เป็นต้น

ในคลาส ThingBag ของฉัน ฉันได้เตรียมใช้งาน Creatures ทั้งหมดของฉันดังนี้:

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

จากนั้นฉันก็มีฟังก์ชัน populateBag() ที่มีลักษณะดังนี้:

public void populateBag(){
    initCreatures();

    bag.add(bears);
}

คำจำกัดความรายการอาร์เรย์ของฉันอยู่ใน ThingBag และมีลักษณะดังนี้:

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

ตัวสร้างสิ่งมีชีวิตของฉันมีลักษณะดังนี้:

    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;
    }

ฉันต้องการพิมพ์ชื่อหมี

โดยหลักแล้วฉันกำลังทำสิ่งนี้:

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

ทำไมฉันไม่สามารถเข้าถึงชื่อในกระเป๋าของฉันได้? ถ้าฉันไม่ได้ใช้อินเทอร์เฟซ ฉันจะสามารถพูดได้ว่า:

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

แต่ตอนนี้ฉันทำไม่ได้ มีความคิดเห็นใดบ้างว่าฉันสามารถเข้าถึงคุณค่านั้นได้อย่างไร ตอนนี้ฉันเข้าถึงได้เฉพาะที่อยู่หน่วยความจำเท่านั้น...


person Sarah    schedule 28.01.2014    source แหล่งที่มา


คำตอบ (3)


ตัวแปร bag ของคุณถูกประกาศเป็น

ArrayList<ThingBagInterface> bag ...

ตามแนวคิดแล้ว หมายความว่ามีวัตถุอย่างน้อย ThingBagInterface รายการ สามารถมี ThingBagInterface ประเภทใดก็ได้ แต่อย่างน้อยจะต้องมี ThingBagInterface

ความหมายอีกอย่างก็คือคอมไพลเลอร์สามารถรับประกันได้ว่าจะมี ThingBagInterface ดังนั้นคุณจึงสามารถโต้ตอบกับองค์ประกอบต่างๆ ของมันคืออินสแตนซ์ ThingBagInterface เท่านั้น

name ไม่ใช่ฟิลด์ที่มีอยู่ในประเภท ThingBagInterface แต่มีอยู่ใน Creature

คุณสามารถส่งค่าที่ส่งคืนเป็น bag.get(i) หรือประกาศวิธีการ getName() เป็น ThingBagInterface นำไปใช้ในประเภทย่อย และเรียกใช้ในลูปของคุณ

person Sotirios Delimanolis    schedule 28.01.2014
comment
ขอบคุณ นี่เป็นครั้งแรกที่ฉันพยายามใช้อินเทอร์เฟซ ดังนั้นฉันจะทำผิดพลาดโง่ๆ มากมายจนกว่าฉันจะเข้าใจได้จริง ขอขอบคุณอีกครั้ง. - person Sarah; 28.01.2014
comment
โปรดทราบว่าหากคุณจะแปลงองค์ประกอบเป็น Creature ก็ไม่มีเหตุผลมากนักที่จะต้องมี ThingBagInterface เลย ArrayList<Creature>จะทำงานได้ดีขึ้น - person user2357112 supports Monica; 28.01.2014
comment
@Sarah จดสิ่งที่ user2357112 เพิ่งพูด คุณมี ThingBagInterface มากมายไหม? พวกเขาทั้งหมดมี name หรือไม่? ลองสร้างคลาสพื้นฐานสำหรับคลาสทั้งหมด - person Sotirios Delimanolis; 28.01.2014
comment
พวกเขาล้วนมีชื่อ ฉันไม่แน่ใจว่าฉันต้องการอินเทอร์เฟซหรือมรดกจริงๆ ฉันมีรายการอาร์เรย์ของสิ่งมีชีวิต แต่ฉันจำเป็นต้องเปลี่ยนเนื่องจากรายการอาร์เรย์ของฉันต้องเก็บสิ่งต่าง ๆ หลายประเภท พวกเขาล้วนมีชื่อ ดังนั้นบางทีนั่นคือที่ที่ฉันควรจะไป แต่ชื่อคือทั้งหมดที่พวกเขามีเหมือนกัน - person Sarah; 28.01.2014

คุณจะต้องออกแบบอินเทอร์เฟซ ThingBagInterface ให้สมเหตุสมผลมากขึ้น การมีชื่อจำเป็นหรือไม่? หากเป็นเช่นนั้น อินเทอร์เฟซจำเป็นต้องมีวิธีในการเข้าถึงชื่อของออบเจ็กต์ (นี่ต้องเป็นวิธีการ เนื่องจากอินเทอร์เฟซไม่สามารถระบุฟิลด์ได้) ในขณะที่เรากำลังดำเนินการอยู่ การเลือกชื่อที่ให้ข้อมูลมากกว่า ThingBagInterface จะเป็นความคิดที่ดี

person user2357112 supports Monica    schedule 28.01.2014
comment
มันเป็นอินเทอร์เฟซสำหรับกระเป๋าที่เก็บสิ่งต่าง ๆ ซึ่งเป็นชื่อชิ้นส่วนเกมสำหรับเกมกระดานที่ฉันกำลังพยายามใช้ ดังนั้นจึงค่อนข้างให้ข้อมูล แต่ฉันเข้าใจสิ่งที่คุณพยายามจะพูด ดังนั้นขอบคุณ - person Sarah; 28.01.2014
comment
@Sarah: ชื่อไม่ได้ให้ข้อมูลใด ๆ เกี่ยวกับความเกี่ยวข้องกับ ThingBag ดูเหมือนว่า ThingBag ควรจะนำไปใช้ ไม่ใช่สิ่งของที่อยู่ในกระเป๋า ลองนึกภาพถ้าอินเทอร์เฟซสำหรับผู้โดยสารในรถยนต์เรียกว่า CarInterface - person user2357112 supports Monica; 28.01.2014

อาจจะแสดงแบบนั้น System.out.println(i+". "+(((Creature)tb.bag.)get(i));

เนื่องจากอินเทอร์เฟซไม่มีแอตทริบิวต์ชื่อ โปรดจำไว้ว่าฟิลด์ในอินเทอร์เฟซจะเป็นแบบคงที่และเป็นสาธารณะโดยปริยายเสมอ

ฉันหวังว่านี่จะช่วยได้.

person user_loser    schedule 28.01.2014