Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 1. С Эйфелем самое сложное - это ООП. Там квинтэссенция множественного наследования, причем оно полноценное, вместе с constrained genericity и прочими фишками.
- Т.е. сначала нужно понять, как происходит наследование:
- inherit - наследование интерфейса и, возможно, реализации
- insert - наследование реализации без сабтайпинга, т.е.
- class B insert A
- ...
- local
- a:A
- b:B
- do
- a:=b
- вызовет ошибку
- Далее, копать в сторону adaptation, адаптации класса при наследовании:
- undefine - отменить реализацию и следуть фичу deferred. Полезно, когда при наследовании из двух предков есть inheritance clash
- redefine - пудет переопределение в наследнике
- rename - переименование фичи. Полезно при множественном наследовании. Пример:
- class A
- ...
- feature {ANY}
- do_something is
- do
- std_output.put_string(once "Do something%N")
- end
- end
- class B
- inherit A
- rename do_something as do_something_else
- end
- ...
- local
- a:A
- b:B
- do
- ...
- b.do_something_else
- a:=b
- a.do_something
- end
- выдаст два раза Do something
- end
- Еще копать в сторону DbC - Design by Contract, clause require и ensure
- При наследовании предусловия могут только ослаблаться (require else), а постусловия только усиливаться (ensure then)
- Точно так же и с аргументами и возвратом: требования к аргументам могут только ослаблаться, т.е. в предке do_it(b:B), а в наследнике do_it(b:A), где A - предок B
- На возрат наоборот: в предке do_it:A, в наследнике do_it:B
- Есть определение типов через другую фичу или себя: do_it:like Current (возврат того же типа, что и сам класс) или do_it:like do_something. Это может вызвать такую штуку, как CAT-call, про них лучше почитеть у Мейера.
- Еще genericity: ARRAY[E->A]
- Еще кортежы и агенты, с которыми лучше посмотреть на примеры, и все будет понятно. В smarteiffel агенты нельзы определить замыканиями.
- Еще есть экспорт фич вместо protected/public
- Так как это множественное наследование, то из стандартных паттернов часть бессмысленна, поскольку можно без них сделать проще, а у части, типа синглтона, нет побочных эффектов.
- 2. Вызовы в С:
- 2.1. c_inline_c - вставляет указанный код прямо в сгенеренный сишный файл:
- c_inline_h - соответственно, в h
- Пример из SDL_SURFACE
- c_cliprect(ap:POINTER):POINTER is
- local
- lp :POINTER
- do
- c_inline_h("#include <sdl\sdl.h>")
- lp:=ap
- c_inline_c("R=&(((SDL_Surface*)_lp)->clip_rect);%N")
- end
- 2.2. Оформить, как фичу. Пример оттуда же
- c_display_format(ap_surface:POINTER):POINTER is
- external
- "C" alias "EifSDL_DisplayFormat"
- end
- Так можно и доступ к полям структуры сделать, но я синтаксис не помню.
Advertisement
Add Comment
Please, Sign In to add comment