2017-01-07 13 views
1

У меня есть базовый класс называется Game и нескольких классов детей, такие как NFLGame, NBAGame, NHLGame, и так далее, и в моем коде, я положить кучу этих дочерних объектов в массив определяется как:Правильный способ бросить список объектов из родительского класса различных дочерних классов

ArrayList<Game> games = new ArrayList<>();

, а затем прочитать каждую игру в массиве я могу думать о двух вариантов, как получить к ним доступ.

  1. Сделать длинную цепочку if/else if или switch, чтобы проверить, какой ребенок класс игры принадлежит к использованию instanceof(), а затем бросить его в соответствующий класс ребенка.

  2. Использовать технику хеш-таблицы, которая использует идентификатор ключа, который присваивается каждому дочернему классу и имеет значение, которое является вызовом метода интерфейса, который выполняет правильный дочерний класс. Я должен добавить, что это метод, который я использую в настоящее время, потому что в конечном итоге я хочу добавить намного больше лиг, что сделало бы это более чистым и эффективным подходом.

Но мой вопрос заключается в следующем: это единственный два варианта при чтении объектов нескольких классов детей из списка/массива или есть лучший способ пойти по этому поводу?

EDIT:

В соответствии с просьбой вот мой класс игры:

public abstract class Game 
{ 
    private String mHomeTeamName, mAwayTeamName, mGameStartTimeLocal, mHomeTeamLogoSrc, mAwayTeamLogoSrc; 
    private String mHomeTeamFullName, mAwayTeamFullName; 
    private String mHomeTeamRecord, mAwayTeamRecord, mHomeTeamScore, mAwayTeamScore; 
    private boolean mGameEnded, mIsGamePostponed, mIsChecked; 
    private boolean mWasAddedToCheckedGamesMap; 
    private int mLeagueID; 
    private String mLeagueName, mGameDateTimeUTC, mGameDateUTC, mGameID; 
    private Date mGameDate; 

    public Game(int leagueID, String leagueName) 
    { 
     mLeagueID = leagueID; 
     mLeagueName = leagueName; 
    } 

    public Game(String homeTeam, String homeTeamFullName, String awayTeam, String awayTeamFullName, 
       String gameStartTimeLocal, String homeTeamRecord, String awayTeamRecord, String homeTeamLogoSrc, 
       String awayTeamLogoSrc, String homeTeamScore, String awayTeamScore, boolean gameEnded, 
       boolean isGamePostponed, String leagueName, int leagueID, Date gameDate, 
       String gameDateTimeUTC, String gameDateUTC) 
    { 
     mHomeTeamName = homeTeam; 
     mAwayTeamName = awayTeam; 
     mHomeTeamFullName = homeTeamFullName; 
     mAwayTeamFullName = awayTeamFullName; 
     mGameStartTimeLocal = gameStartTimeLocal; 
     mHomeTeamRecord = homeTeamRecord; 
     mAwayTeamRecord = awayTeamRecord; 
     mHomeTeamLogoSrc = homeTeamLogoSrc; 
     mAwayTeamLogoSrc = awayTeamLogoSrc; 
     mHomeTeamScore = homeTeamScore; 
     mAwayTeamScore = awayTeamScore; 
     mGameEnded = gameEnded; 
     mIsGamePostponed = isGamePostponed; 
     mLeagueName = leagueName; 
     mLeagueID = leagueID; 
     mGameDate = gameDate; 
     mGameDateUTC = gameDateUTC; 
     mGameDateTimeUTC = gameDateTimeUTC; 
     mIsChecked = false; 
    } 
} 
+0

Оффлайн, похоже, что вы приближаетесь к проблеме с неправильного направления (то есть, мы называем [Задача X-Y] (http://meta.stackexchange.com/q/66377/223467)). Зачем вам это делать? Точка полиморфизма имеет общий интерфейс, и каждый класс реализует ** те же методы ** в соответствии с их собственной логикой, поэтому вам даже не нужно их бросать. – Mureinik

+0

Можете ли вы поделиться каким-то фактическим кодом (или даже псевдокодом) методов в 'Game' и тем, что вы хотите, чтобы ваш цикл был создан, поэтому у нас есть что-то конкретное для обсуждения? Это поможет мне дать более четкий ответ. – Mureinik

+0

@Mureinik в порядке Я думаю, что вы имеете в виду, но как насчет тех дочерних классов, которые имеют разные методы, которые базовый класс не должен реализовывать? –

ответ

1

Да. Вам нужен шаблон для посетителей (см. 1).

Идея состоит в том, чтобы добавить метод в свой класс игры accept(Visitor visitor), который переопределяется в каждом подклассе (NBAGame и т. Д.). Реализация в основном что-то вроде visitor.visit(this).

Чтобы построить интерфейс Visitor с соответствующими методами посещения visit(NBAGame), visit(NHLGame) и так далее.

Чтобы реализовать этот интерфейс Visitor, чтобы сделать то, что вам нужно с каждым типом элемента.

Затем позвоните по номеру accept с выбранным посетителем каждого элемента вашей коллекции.

Основополагающий механизм называется двойной отправкой (см. 2).

Никакой бросок, нет, если нет экземпляра.

+0

Интересно. Спасибо, я посмотрю больше на это. –

+0

Когда вы будете знать об этом шаблоне, вы будете использовать его каждый раз, когда вам нужна иерархия понятий и коллекций. Легко. –

+1

Это именно то, что я искал! Он работает отлично. Спасибо. Для всех, кто читает это, можно найти действительно хороший учебник Youtube о том, как реализовать этот шаблон [здесь] (https://www.youtube.com/watch?v=pL4mOUDi54o). –