Mercurial > hg > Document > Growi
view Gears/introduction/interface/impl.md @ 2:b6c284fd5ae4
backup 2020-12-16
author | autobackup |
---|---|
date | Wed, 16 Dec 2020 15:11:16 +0900 |
parents | e12992dca4a0 |
children |
line wrap: on
line source
# Interfaceの実装 - [[Interfaceの定義については確認しました>../about]] - 続いては定義したInterfaceに具体的な実装を書いていきます # 構文 - 構文は明確には定まっている訳ではなく[[anatofuz>/user/anatofuz]]が勝手に考えているものです - 2019/12/25までの論文ではInterfaceの定義の記述のみしか存在していない為です ```c typedef struct ImplName<Type, Isa> impl <InterfaceName> { struct pipe* p; int i; int n; __code cbc_piperead1(Type* sys_read, struct pipe* p, __code next(...)); __code cbc_piperead2(Type* sys_read, int i, int n, struct pipe* p, __code next(...)); __code cbc_piperead3(Type* sys_read, int i, struct pipe* p, __code next(...)); __code next(...); } ImplName; ``` - 構文はInterfaceの構文と似ています ## 解説 ### 1行目(実装名の定義) - 先頭に「実装の構造体の名前」「実装するInterfaceの名前」を書きます - `typedef struct ImplName<Type, Isa> impl <InterfaceName>` - `typedef struct`の直後の実装名を書きます - `impl`の後の `<>` の中にInterface名をいれます - 現時点では実装できるInterfaceは1つだけになっています - `<Type, Isa>`については後ほど解説します ### DataGear部分 - Interfaceと同じ様にImpl内で使う引数を列挙します - Interfaceで定義したAPIの引数ではありません ### CodeGear部分 - `__code name()`で記述します - `Type`が「自分自身の型」であり Isaが「Interfaceの型」のエイリアスです - これらのCodeGearはInterfaceが提供するものではないので、一種のprivate methodです - Interfaceの使用側からは意識しないCodeGearになります - Interfaceで登録された`next`に継続する必要があります