سؤال

عذرا، أعتقد أن هذا سؤال الميراث: كان سؤال ArrayList على طول

!

وطيب، مشكلتي هي أكثر تحديدا مما كنت اعتقد. لذلك ليس لدي عائلتين من الطبقات. بطاقات، والمناطق. مناطق هي صناديق لعقد البطاقة.

والمقصود

والفئات الفرعية الأولين من المنطقة، ZoneList وZoneMap أن يكون بطريقتين مختلفتين لتخزين بطاقات. فرعية أخرى، مثل اليد، وPokerHand، لها طرق خاصة بها للتعامل مع البطاقات التي تخزن.

وأين تتعقد هو أن بطاقة لديها أيضا الفئات الفرعية، مثل PokerCard، وأن فرعية من ZoneList وZoneMap تهدف إلى تنظيم تلك.

وحتى في ZoneList لقد protected ArrayList<Card> cardBox; وفي PokerHand كنت أتوقع أن تكون قادرة على إعلان cardBox = new ArrayList<PokerCard>(); منذ PokerCard هي البطاقة. الخطأ وأنا على الحصول على ما يبدو هو أنني لا يمكن أن يلقي بين البطاقة وGangCard عندما يتعلق الأمر ArrayLists ... لذا كنت أحاول أن إصلاح هذا فقط عن طريق redeclaring cardBox كما private ArrayList<PokerCard> cardBox; داخل PokerHand، ولكن ذلك أدى إلى الاختباء الذي التنصت حتى برنامجي.

وSO حقا، والسؤال هو حول الصب بين ArrayLists؟ جافا يقول لي لا أستطيع، لذلك أي أفكار عن كيف يمكن؟

وض.

هل كانت مفيدة؟

المحلول

إذا كنت فهمت بشكل صحيح، ربما يجب عليك نعلن ما يلي:

public class ZoneList<T extends Card> {
   protected List<T> cardBox;
}

public class PokerHand extends ZoneList<PokerCard> {
   public PokerHand() {
      cardBox = new ArrayList<PokerCard>();
   }
}

نصائح أخرى

أعطت

ومارك وkolstae إجابات جيدة من حيث كيفية التفاف على المشكلة، ولكن أعتقد أنه يستحق موضحا <م> لماذا كود الأصلي الخاص بك لا يعمل.

لتبسيط الأمور، أنا أميل إلى وضع هذه المشكلة من حيث الفاكهة. لنفترض أن لدينا:

List<Banana> bananaBunch = new ArrayList<Banana>();
List<Fruit> fruitBowl = bananBunch;
fruitBowl.add(new Apple());

إذا ما سمح لهذا، نحن في نهاية المطاف مع تفاحة في مجموعة من الموز، والتي من الواضح أن شيئا سيئا. فأين هي المشكلة؟ السطر الأول يجب أن يكون بخير، والخط الثالث له على ما يرام - يمكنك إضافة أي نوع من الفاكهة لList<Fruit> - وبالتالي فإن مشكلة يجب أن تكون في السطر الثاني. هذا ما المحظورة، على وجه التحديد لتجنب هذا النوع من القضايا.

هل هذا يساعد على الإطلاق؟

وأولا وقبل كل شيء، انها عادة ما تكون أفضل الممارسات لاستخدام أساليب جالبة / اضع من الوصول إلى خصائص مباشرة، وخاصة إذا كنت تنوي أن تفعل الكثير من الميراث معقدة.

وأما بالنسبة لمشكلة الوراثة، قد تتمكن من محاولة تحديد جالبة cardBox في الطبقة المتفوقة (أو المستوى الأعلى واجهة / فئة مجردة) على النحو التالي:

protected ArrayList<? extends Card> getCardBox();

وبهذه الطريقة يمكنك ovverride في الفئات الفرعية ويكون لهم إرجاع قائمة من أي نوع من فئة فرعية من بطاقة.

واحد طريقة للقيام بذلك هو عن طريق الصب إلى ArrayList أولا:

ArrayList<Card> cards = (ArrayList<Card>)(ArrayList<?>) (pokerCardObjects);

وبدائل أخرى دون الصب:

ومع تيارات:

ArrayList<Card> cards = pokerCardObjects.stream().collect(Collectors.toCollection(ArrayList::new);

وأو خلق ArrayList الجديد:

ArrayList<Card> cards = new ArrayList<>(pokerCardObjects);

وكما ذكر، لا يمكنك يلقي ArrayList<PokerCard> إلى ArrayList<Card>، ولكن هل يمكن أن يلقي ArrayList<PokerCard> إلى ArrayList<? extends Card>. أو أفضل استخدام List<? extends Card> كقيمة عودتك، لأنك ربما لا تعتمد على تنفيذ ArrayList على أي حال:

protected ArrayList<? extends Card> getCardBox();

وأما عن سؤالك في تعليق، يجب بناء العمل كما وصفته أنت: List<? extends Card> list = new ArrayList<Card>();. ربما لديك لملء القائمة الخاصة بك، لذلك فإن هذه الطريقة ربما شيء من هذا القبيل:

protected ArrayList<? extends Card> getCardBox() {
    List<Card> list = new ArrayList<Card>();
    list.add(pokerCard1);
    list.add(pokerCard2);
    return java.util.Collections.unmodifiableList(list);
}

وهذا هو الذهاب الى تعتمد على ما هو التحكم في الوصول على Arraylist في Zonelist. بلدي الافتراض من البيان المصحح هو أنه إما غير المراقب العام، أو حماية. A فرعية يمكن "إخفاء" أحد الوالدين الفئة 'متغير له الوصول إلى عن طريق تحديد المتغير الذي يحمل نفس الاسم. يمكنك أيضا استخدام الكلمة this للإشارة إلى مثيل كائن معينة وsuper الكلمة للإشارة إلى الأصل.

وهنا هو وجود صلة جيدة على التحكم في الوصول الأساسية في جاوة:

http://java.sun.com/docs /books/tutorial/java/javaOO/accesscontrol.html

وهذا قد تجد من المفيد أيضا

http://java.sys-con.com/node/46344

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top