2014-11-03 2 views
0

Я пытаюсь написать код (начинающий пользователь java здесь), и я получаю сообщение об ошибке. У меня есть догадка, что это имеет какое-то отношение к определению моего класса для AdvancedMatch, которое является совпадением в турнире. Он должен иметь два фидера, которые могут быть либо AdvancedMatch, либо InitMatch, где у InitMatch нет фидеров и AdvancedMatch. Для этого я использовал интерфейс ITournament, который дает мне возможность иметь ITournament внутри моей структуры данных AdvancedMatch.Интерфейс как часть структуры данных

public class AdvancedMatch implements ITournament { 
    MatchData data; 
    ITournament feeder1; 
    ITournament feeder2; 

    AdvancedMatch (MatchData data, ITournament feeder1, ITournament feeder2) { 
    this.data = data; 
    this.feeder1 = feeder1; 
    this.feeder2 = feeder2; 
    } 
} 


public class InitMatch implements ITournament { 
    MatchData data; 

    InitMatch (MatchData data) { 
    this.data = data; 
    } 
} 

interface ITournament { 
    public Boolean allScoresValid(); 

    public Boolean highCapacityVenue(int ticketsSold); 

    public Boolean winnerAlwaysAdvanced(); 

    public Boolean tWinnerContestant1() ; 

} 

Позже в коде, я пытаюсь вызвать feeder1.data внутри метода, и я получаю ошибку, что данные не могут быть разрешены или не является полем. Это меня смущает, так как четкие данные являются частью как AdvancedMatch, так и InitMatch.

public Boolean winnerAlwaysAdvanced() { 
    if (this.feeder1.tWinnerContestant1()) { 
     this.data.dCompareContestants1(this.feeder1.data); 
    } 
    else 
     return this.data.dCompareContestants2(this.feeder1.data); 
    } 
} 

Любая помощь будет принята с благодарностью.

+1

Также обычно полезно включать трассировку стека ошибки, которую вы испытываете, при обращении за помощью. Не то, чтобы это всегда было необходимо, но когда вы указываете, что у вас есть ошибка, обычно можно ожидать, что трассировка стека будет включена в описание проблемы. – mattias

+1

Просьба показать контекст 'winnerAllwaysAdvanced()'. В каком классе он реализован? –

ответ

1

Ваш фидер1 объявлен как товарный знак ITournament feeder1; - он не объявлен как InitMatch, который имеет атрибут data.

Когда переменная объявляется с использованием интерфейса, она может обращаться только к вещам, объявленным в интерфейсе , независимо от исходного экземпляра класса.

Поскольку как InitMatch, так и AdvancedMatch имеют данные , вы можете включить это в определение вашего интерфейса. Однако лучшие практики будут требовать «getter» вместо прямого доступа.

interface ITournament { 
    public Boolean allScoresValid(); 
    public Boolean highCapacityVenue(int ticketsSold); 
    public Boolean winnerAlwaysAdvanced(); 
    public Boolean tWinnerContestant1(); 
    public MatchData getMatchData(); 
} 
+0

Так есть ли способ, которым я могу иметь feeder1 и feeder2 быть либо AdvancedMatch, либо InitMatch? Мне нужно иметь возможность создавать многоуровневое дерево с помощью InitMatches, чтобы завершить каждую ветку (они запускают турнир без матчи фидера). – Charles

+0

Ах, конечно, я думаю, что попробую вторую часть вашего ответа. Надеюсь, это сработает. Спасибо! – Charles

0

Для класса для реализации интерфейса он должен реализовать все методы интерфейса.

Ни один из ваших классов не реализует все методы интерфейса ITournament.

+0

Это еще не полный код. Я не размещал весь код по соображениям пространства, просто потому, что я думал, что это простой случай отсутствия правильного определения класса с интерфейсом в качестве поля. Если это не проблема, я здесь полностью потерян. – Charles

+0

@Charles - было бы хорошей практикой, затем включить этот метод, но заменить тело '/ * опущенным для краткости * /' или что-то еще, поэтому читатели знают, что это было намеренно опущено. –

Смежные вопросы