Установка файлов заголовков в Eiffel?

Я изучаю Eiffel, и я знаю, что в C я могу сделать что-то подобное, чтобы установить файлы заголовков, например::

#define USER_ACTIVE     0
#define WHEN_SOMETHING  1
#define WHERE_HAND      2
#define WHERE_ACTIVE    3
#define WHERE_GOOD      4

а также наличие экземпляров, например:

typedef struct something {
   int user;
   int where;
   int somethingelse
}something;

или даже указатели функций коллекции:

typedef struct decisions {
  void (*init)(struct something *s, int who, double factor);
}decisions;

И та же история почти со всеми обычными языками программирования. Я искал fx здесь кроме того, что это плохо переведено, мне трудно понять, как это сделать.. так есть ли "нормальный" способ сделать это на этом языке ? или все должно быть сделано в стиле спагетти?

Благодарность


person jycr753    schedule 28.10.2013    source источник
comment
Более полный пример поможет понять проблему. Вас интересует только объявление констант, которые можно использовать в других классах? В частности, когда речь идет об обновлении/добавлении/удалении исходного значения, похоже ли это на #define, #undef в C-подобных языках?   -  person Alexander Kogtenkov    schedule 28.10.2013
comment
@kwaxer, да, извините, я должен был уточнить с самого начала, я думаю, что сейчас лучше для будущих людей, которые ищут это :)   -  person jycr753    schedule 28.10.2013
comment
В Eiffel определения типов сопоставляются с классами, а указатели функций сопоставляются либо с полиморфными функциями, либо с выделенными классами, либо с агентами в зависимости от требуемого уровня гибкости. Я расширю свой ответ, чтобы охватить их.   -  person Alexander Kogtenkov    schedule 28.10.2013


Ответы (1)


Пример можно перевести примерно так:

class MY_CONSTANTS feature
    user_active: INTEGER = 0
    when_something: INTEGER = 1
    where_hand: INTEGER = 2
    where_active: INTEGER = 3
    where_good: INTEGER = 4
end

class SOMETHING
feature -- Access
    user: INTEGER
    where: INTEGER
    somethingelse: INTEGER
feature -- Modification
    set_user (u: like user) do user := u end
    set_where (w: like where) do where := w end
    set_somethingelse (s: like somethingelse) do somethingelse := s end
end

deferred class DECISION feature
    init (s: SOMETHING; who: INTEGER; factor: REAL_64) deferred end
end

class DECISION_1 inherit DECISION feature
    init (s: SOMETHING; who: INTEGER; factor: REAL_64)
        do
            ...
        end
end

class DECISION_2 inherit DECISION feature
    init (s: SOMETHING; who: INTEGER; factor: REAL_64)
        do
            ...
        end
end

class MY_CLASS inherit
    MY_CONSTANTS
... -- user_active, when_something, etc. can be used here
feature
    something: SOMETHING
    decision: DECISION
...
           -- Somewhere in the code
        create something
        if ... then
            create {DECISION_1} decision
        else
            create {DECISION_2} decision
        end
        ...
        decision.init (something, ..., ...)
    ...
end
person Alexander Kogtenkov    schedule 28.10.2013
comment
так что мне не нужно говорить #include, так как все классы глобальны, верно? - person jycr753; 28.10.2013
comment
Верно. Но вам нужно наследовать от ЧЕГО-ТО, чтобы сделать его функции доступными, или создать его экземпляр. PS: вместо #include на самом деле есть файл проекта/xace, в котором есть расположение файла. Таким образом, #include не разбросаны по каждому исходному файлу. - person Berend de Boer; 29.10.2013