Crystal: методы деформации или расширения класса, такие как CSharp - PullRequest
0 голосов
/ 24 мая 2018

Я экспортировал структуру из библиотеки C, которая Void*

lib LibXXX
    alias OldStruct = Pointer(Void)
    fun foo(old : OldStruct)
end

И хочу добавить некоторые методы к LibXXX::Old

Я знаю, что это может быть сделано толькоДеформация класса в большинстве языков:

struct NewStruct {
    OldStruct old;
    void new_functions();
};

Но действительно беспокоит то, что я должен получить доступ к полю old явно.LibXXX.foo(old.old)

Мне нужен какой-то прозрачный способ сохранения простого представления LibXXX.foo(old), например Наследование или Методы расширения в CSharp.

Я пытался:

struct NewStruct < LibXXX::Old
# ...
end

Но произошла ошибка компиляции:

can't extend non-abstract struct Pointer(Void)

Я считаю, что это должно быть сделано с помощью Crystal.Но я не знаю, что такое лучшая практика, поэтому, пожалуйста.

1 Ответ

0 голосов
/ 24 мая 2018

Лучше всего иметь вокруг вашего объекта не-lib обертку, которая оборачивает все существующие методы.Это часто хорошее место для добавления новых функций или идиоматических абстракций.

lib LibPet
  alias Pet = Void*
  alias Dog = Void*

  fun make_dog : Dog
  fun bark(bar : Dog)
  fun move(pet : Pet)
  fun retreat(pet : Pet)
end

struct Dog
  def initialize
    @dog = LibPet.make_dog
  end

  def bark
    LibPet.bark(@dog)
  end

  def move
    LibPet.move(@dog)
  end

  def retreat
    LibPet.retreat(@dog)
  end

  def at_front
    move
    yield
  ensure
    retreat
  end

  def attack
    at_front { bark }
  end
end
...