2009-12-29 2 views
2

Чтобы помочь понять смысл Objective-C, я создаю очень базовое соединение 4 игры без какао.Класс в Objective-C Вопрос: Возможно ли наследовать переменную класса?

В моей программе у меня есть три модуля:

  • «Игра»: Содержит массив, который содержит информацию о плате. Объект, созданный внутри основного, и отвечает за повороты. Объекты Player и Computer живут в этом модуле.
  • «Игрок»: удерживает функцию, которая вставляет фрагмент игрока в предпочтительный столбец (этот модуль существует для инкапсуляции, и только это).
  • «Компьютер»: содержит функции, которые определяют на основе текущей настройки платы, где компьютер должен перемещаться, а затем помещает фрагмент в это место.

В идеале я хотел бы для классов игрока и компьютера, чтобы иметь возможность редактировать один и тот же экземпляр pieceLoc, который живет в игре через какое-то наследство, однако я не уверен, как это сделать.

Вот отрывок из того, что я в настоящее время я думаю о:
// startGame exists within the "Game" module

char *pieceLoc[42]; // This is a *temporary* global var. I'm still learning about 
        // the best way to implement this with class and instance 
        // methods. This is the array that holds the board info. 

-(void) startGame { 
Player *player =[[Player alloc] init]; // player's symbol = 'X' 
Computer *computer =[[Computer alloc] init]; // computer's symbol = 'O' 

int i = 0; 
while ([game hasPieceWon: 'X'] == NO && [game hasPieceWon: 'O'] == NO) { 
    //function for player move 

     if ([game hasPieceWon: 'X'] == NO) { 
     //function for computer move 
     } 
    } 
if ([game hasPieceWon: 'X'] == YES) 
    // Tell the player they've won 
else 
    // Tell the player the computer has won. 

}

Функции, используемые для игроков и компьютерных ходов являются функции, которые нужно будет каким-то образом получить доступ к массиву pieceLoc (который будет в будущем существуют как переменная экземпляра, как только я узнаю больше о методах класса и экземпляра). pieceLoc в настоящее время существует как char *, если мне нужно передать его через параметры функции.

Я чувствую, что это довольно простая проблема с тем, как я думаю об ООП, но я не смог найти ответ на то, что искал, несмотря на большую часть дня. Из того, что я собрал, мой вопрос относится к классу, но я не мог найти хороший ресурс для Objective-C.

Итак, снова: Я ищу способ, чтобы передать один экземпляр pieceLoc, который живет в игре «родительский класс» для двух «детских классов», где pieceLoc можно непосредственно манипулировать без с использованием дополнительных параметров.

Если передача массива в качестве параметра в конечном итоге является более идиоматической задачей, могу ли я получить пример того, как в ссылке Objective-C выполняется передача по ссылке?

Спасибо за помощь!

+0

Есть ли причина, по которой вам не нравится иметь информацию о доске, хранящуюся в этом глобальном массиве? –

+0

Являются ли 'Player' и' Computer' дочерними классами? – outis

ответ

4

Как вы, наверное, уже поняли, Objective-C на самом деле не имеют «класса переменных», которые вы можете наследовать от класса супер.

Один из способов построить это таким образом, что вы не должны иметь глобальную переменную будет что-то вроде этого:

У вас есть объект игры, который содержит ссылки на каждый из игроков, и Совету. Игроки либо каждый из них инициализируются ссылкой на Совет. Ваш метод StartGame (в игре) будет иметь такой код:

board = [[Board alloc] init]; 
player = [[Player alloc] initWithBoard: board]; 
computer = [[ComputerPlayer alloc] initWithBoard: board]; 

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

В методах initWithBoard в Player и ComputerPlayer вы просто сохраните экземпляр доски и используйте его для передачи ходов, которые каждый игрок решает сделать. Игра установит порядок ходов и будет отслеживать любое глобальное состояние. Когда Player и ComputerPlayer будут выпущены в конце игры, они высвободят свою ссылку на доску в своем методе dealloc.

1

Поскольку Objective-C не имеет переменных класса per-se (они просто моделируются с использованием статических переменных), дочерние классы могут обращаться к статическим глобальным глобальным объектам только напрямую, если вы определяете метод в том же исходном файле/модуле компиляции , Это нарушает другие лучшие методы (одно определение класса для единицы компиляции). Обычный подход к полям класса доступа заключается в использовании аксессуаров.

В этом случае, будьте осторожны, вы не слишком плотно работаете над классами couple. Передача платы (как объекта, а не массива) на Player (Person может быть лучшим именем, поскольку компьютер также является игроком) и Computer, будь то как параметр метода или свойство, более гибко, чем ссылаться на глобальный или статический член другого класса.Объекты игрока решают, где разместить, а затем сообщают доске, где можно разместить кусок. В качестве альтернативы, игра передает доступную для чтения версию доски игроку; метод размещения игрока возвращает туда, где нужно разместить кусок. Во-первых, развязка и использование объекта платы может предотвратить обман. Представьте, что кто-то вводит свой собственный класс Player, который позволяет им размещать несколько фрагментов в свою очередь. С другой стороны, косвенность облегчает добавление поддержки сети (сообщения между объектами становятся сетевыми сообщениями в процессе, прозрачном для локальных объектов).

Подумайте также о том, где созданы игроки. Возможно, было бы разумнее создать что-то другое для игроков и передать их методу startGame. Это имело бы смысл, если бы игроки участвовали в турнире, например, и игровые объекты, таким образом, должны существовать дольше, чем одна игра.

Состав класса относится к одному объекту, имеющему другой элемент. C, например, не поддерживает наследование, но позволяет вам встраивать структуры. Другой способ сказать это, что класс состоит из отношений «has-a», а наследование - отношения «is-a». Классы игроков, например, могут иметь указатель на доску, каждый из которых использует для размещения фрагментов.

Объектив-C также не имеет пропусков. Вместо этого он использует указатели.

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

// nextPlayer returns 'nil' if game is over (win or tie) 
while currPlayer := [game nextPlayer]: 
    // player will tell board where to place piece 
    [currPlayer move] 

Или:

// nextPlayer always returns a valid player 
while currPlayer := [game nextPlayer]: 
    // player's method returns what and where to place 
    [self place:[currPlayer move] for:currPlayer] 
    // explicitly test for game end, which includes wins & ties 
    if [game isOver]: 
     break 
Смежные вопросы