Переменная экземпляра super не доступна из определения другой переменной экземпляра - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь сделать несколько ООП в OCAML.

Вот два класса:

class virtual game_object id x y z =
    object (self)
        val id : int = id
        val x : int = x
        val y : int = y
        val z : int = z
        method get_x  = x
        method get_y  = y
        method get_z  = z
    end;;
 class tile id x y z tile_type =
    object(self)
        inherit game_object id x y z as super
        val tile_type : tile_type = tile_type
        val w : int = 80
        val h : int = 80
        val box : Sdl.rect = Sdl.Rect.create super#get_x super#get_y w h (* This line triggers the error *)
        method get_tile_type = tile_type
    end
    ;;

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

The instance variable super cannot be accessed from the definition of another instance variable

Понятия не имею, как решить эту проблему.Пожалуйста помоги?Спасибо.

1 Ответ

0 голосов
/ 28 января 2019

Самым простым решением может быть факторизация общей части экземпляра значения, избегание метода получения суперкласса и просто определение прямоугольника из аргументов класса:

class tile id x y z tile_type =
  let w = 80 in
  let h = 80 in
  object(self)
    val box = Sdl.Rect.create x y w h
    inherit game_object id x y z as super
    val tile_type : tile_type = tile_type
    val w = w
    val h = h
    method get_tile_type = tile_type
end

Если вам нужен доступx и y через геттеры вы можете сделать rect изменяемым, сначала инициализировать его фиктивным значением, а затем добавить инициализатор, чтобы установить его на правильное значение:

class tile id x y z tile_type =
  object(self)
    inherit game_object id x y z as super
    val tile_type : tile_type = tile_type
    val w = 80
    val h = 80
    val mutable box = Sdl.Rect.create 0 0 0 0
    initializer box <- Sdl.Rect.create super#get_x super#get_y w h
    method get_tile_type = tile_type
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...