Hoksmur

VYE eiffel

Dec 9th, 2021
445
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. 1. С Эйфелем самое сложное - это ООП. Там квинтэссенция множественного наследования, причем оно полноценное, вместе с constrained genericity и прочими фишками.
  2.  
  3. Т.е. сначала нужно понять, как происходит наследование:
  4. inherit - наследование интерфейса и, возможно, реализации
  5. insert - наследование реализации без сабтайпинга, т.е.
  6. class B insert A
  7. ...
  8. local
  9. a:A
  10. b:B
  11. do
  12. a:=b
  13. вызовет ошибку
  14.  
  15. Далее, копать в сторону adaptation, адаптации класса при наследовании:
  16. undefine - отменить реализацию и следуть фичу deferred. Полезно, когда при наследовании из двух предков есть inheritance clash
  17. redefine - пудет переопределение в наследнике
  18. rename - переименование фичи. Полезно при множественном наследовании. Пример:
  19. class A
  20. ...
  21. feature {ANY}
  22. do_something is
  23. do
  24. std_output.put_string(once "Do something%N")
  25. end
  26. end
  27. class B
  28. inherit A
  29. rename do_something as do_something_else
  30. end
  31. ...
  32. local
  33. a:A
  34. b:B
  35. do
  36. ...
  37. b.do_something_else
  38. a:=b
  39. a.do_something
  40. end
  41. выдаст два раза Do something
  42. end
  43.  
  44. Еще копать в сторону DbC - Design by Contract, clause require и ensure
  45. При наследовании предусловия могут только ослаблаться (require else), а постусловия только усиливаться (ensure then)
  46. Точно так же и с аргументами и возвратом: требования к аргументам могут только ослаблаться, т.е. в предке do_it(b:B), а в наследнике do_it(b:A), где A - предок B
  47. На возрат наоборот: в предке do_it:A, в наследнике do_it:B
  48.  
  49. Есть определение типов через другую фичу или себя: do_it:like Current (возврат того же типа, что и сам класс) или do_it:like do_something. Это может вызвать такую штуку, как CAT-call, про них лучше почитеть у Мейера.
  50.  
  51. Еще genericity: ARRAY[E->A]
  52. Еще кортежы и агенты, с которыми лучше посмотреть на примеры, и все будет понятно. В smarteiffel агенты нельзы определить замыканиями.
  53.  
  54. Еще есть экспорт фич вместо protected/public
  55.  
  56. Так как это множественное наследование, то из стандартных паттернов часть бессмысленна, поскольку можно без них сделать проще, а у части, типа синглтона, нет побочных эффектов.
  57.  
  58. 2. Вызовы в С:
  59. 2.1. c_inline_c - вставляет указанный код прямо в сгенеренный сишный файл:
  60. c_inline_h - соответственно, в h
  61. Пример из SDL_SURFACE
  62. c_cliprect(ap:POINTER):POINTER is
  63. local
  64. lp :POINTER
  65. do
  66. c_inline_h("#include <sdl\sdl.h>")
  67. lp:=ap
  68. c_inline_c("R=&(((SDL_Surface*)_lp)->clip_rect);%N")
  69. end
  70.  
  71.  
  72. 2.2. Оформить, как фичу. Пример оттуда же
  73. c_display_format(ap_surface:POINTER):POINTER is
  74. external
  75. "C" alias "EifSDL_DisplayFormat"
  76. end
  77. Так можно и доступ к полям структуры сделать, но я синтаксис не помню.
Advertisement
Add Comment
Please, Sign In to add comment