добавление конструкторов делает ошибку?Это не имеет смысла, пожалуйста, помогите, вопрос программирования - PullRequest
1 голос
/ 27 февраля 2011

Я получаю синтаксическую ошибку "insert} для завершения ClassBody.

Этот код работает нормально / без ошибок:

import java.awt.Rectangle;

class Trigger

{

    Type type;
    long time;
    ObjectID controlType;
    int controlNum;
    int resType, resNum;  
    Rectangle location;

    enum Type {TIMED, CONTROLED, LOCATION, RESOURCE};

    Trigger()
    {
    }
}

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

class Trigger

{

    Type type;
    long time;
    ObjectID controlType;
    int controlNum;
    int resType, resNum;  
    Rectangle location;

    enum Type {TIMED, CONTROLED, LOCATION, RESOURCE}; //I get the error on this line

    Trigger(Type.TIMED, long t)
    {
       time = t;
    }

    Trigger(Type.CONTROLLED, int c)
    {
       controlNum= c;
    }

    Trigger(Type.LOCATION, int locx, int locy, int w, int h)
    {
       location = new Rectangle(locx, locy, w, h);
    }

    Trigger(Type.RESOURCE, int resT, int resN)
    {
       resType = resT;
       resNum = resN;
    }
}

** Обратите внимание, что я пишу этот код в процессе обработки!

также, если я переместу строку перечисления вверх (выше «Тип типа»), то ошибкасообщение переходит на строку "Rectangle location;"

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


Обновление

ok Я изменил код, чтобы enum инициализировал переменную типа в каждом конструкторе. Это будет для rts, который я помогаю спроектировать дляпроект класса. Есть еще один класс под названием GameEvent, в котором есть экземпляр триггера и список действий массива. Триггеры будут выгружены из файла, а затем действия будут жестко закодированы (я знаю плохой стиль, но есть только 3миссии и ТА сказали, чтот мы не будем терять оценки за это).Поэтому детские классы звучат как хорошая идея.Но почему это не работает как есть?

вот обновленный код:

import java.awt.Rectangle;

class Trigger

{

    Type type;
    long time;
    FCObjectID controlType;
    int controlNum;
    int resType, resNum;  
    Rectangle location;

    enum Type {TIMED, CONTROLED, LOCATION, RESOURCE};

    Trigger(Type.TIMED, long t)
    {
      type = TIMED;
      time = t;
    }

    Trigger(Type.CONTROLLED, int c)
    {
      type = CONTROLED; 
      controlNum= c;
    }

    Trigger(Type.LOCATION, int locx, int locy, int w, int h)
    {
      type = LOCATION;
      location = new Rectangle(locx, locy, w, h);
    }

    Trigger(Type.RESOURCE, int resT, int resN)
    {
      type = RESOURCE;
      resType = resT;
      resNum = resN;
    }
}

Ответы [ 5 ]

8 голосов
/ 27 февраля 2011

Ваши конструкторы неверны. Например:

Trigger(Type.LOCATION, int locx, int locy, int w, int h)

Что вы ожидаете от части Type.LOCATION в списке параметров? Каждый параметр должен быть типом, за которым следует имя параметра (как правильно, int locx и т. Д.).

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

1 голос
/ 27 февраля 2011

Я бы не советовал писать ваши конструкторы таким образом.

Ваш объект оказывается в разной степени непригодного для использования состояния в зависимости от того, какой конструктор вы вызываете.Объект должен быть на 100% готов к работе после создания, не делая ничего, чтобы удивить клиентов.

Напишите один конструктор, который инициализирует ВСЕ переменные-члены, а затем вызовите «this» из других с разумными значениями по умолчанию.

0 голосов
/ 27 февраля 2011

k Я изменил свои конструкторы на это, и это работает:

Триггер (Тип tT, long t, int c, int locx, int locy, int w, int h, int resT, int resN)

{

type = tT;
if (type == Type.TIMED)
  time = t;
else if (type == Type.CONTROLLED)
  controlNum = c;
else if (type == Type.LOCATION)
  location = new Rectangle(locx, locy, w, h);
else if (type == Type.RESOURCE)
{
  resType = resT;
  resNum = resN;
}

}

0 голосов
/ 27 февраля 2011

Ваш код не имеет смысла.Список аргументов для метода (включая конструкторы) должен быть списком типизированных переменных , а не значений .Type.TIMED это значение, а не тип!

0 голосов
/ 27 февраля 2011

Вы не можете использовать Enum таким образом.Когда вы создаете Enum, вы создаете Type, поэтому ваш конструктор должен принимать переменную, которая является типом вашего Enum, вы не можете «принудительно» заставить его вот так.

Trigget(Type t, [others arguments]) {
}

Я непонять, что вы пытаетесь сделать, но вы должны прочитать некоторую документацию по Enums: http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html

И мне кажется, что вам лучше заняться наследованием вашего класса Trigger.На самом деле не так просто помещать много разных полей в класс и инициализировать их в зависимости от типа Enum.

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

...