[11] [DFN[[CODE(IDL)@en[implements]] [RUBYB[文]@en[statement]]]]は、
ある[[インターフェイス]]を[[実装]]する[[オブジェクト]]が更に[[実装]]しなければならない[[インターフェイス]]を指定するものです
[SRC[>>10]]。

* 仕様書

[REFS[
- [26] [CITE@en[Web IDL]] ([TIME[2017-12-29 22:26:09 +09:00]]) <https://heycam.github.io/webidl/#include>
]REFS]

* 構文

[12] [CODE(IDL)@en[implements]] [[文]]は、次のような[[定義]]です [SRC[>>10]]。
[PRE(IDL example code)[
[VAR[A]] implements [VAR[B]];
]PRE]

[13] これは、 [VAR[A]] を[[実装]]する[[オブジェクト]]が [VAR[B]] 
も[[実装]]しなければならないことを表します [SRC[>>10]]。

* 制約

[16] [[両辺]]が表すものは[[インターフェイス]]でなければなりません。
ただし[[コールバックインターフェイス]]であってはなりません。 [SRC[>>10]]

[15] [[両辺]]の[[インターフェイス]]は異なるものでなければなりません。
一方が他方を[[継承]]していてはなりません。 [SRC[>>10]]

[14] [CODE(IDL)@en[[[implements]]]] [[文]]は[[推移的]]に適用されます [SRC[>>10]]。

[17] [CODE(IDL)@en[[[implements]]]] [[文]]を[[有向グラフ]]の[[辺]]としたとき、
[[循環]]してはなりません [SRC[>>10]]。

;; [18] 次のようなケースは禁止されていませんがいいのでしょうか。
[PRE(IDL example code)[
interface B {};
interface C {};
interface D : C {};
B implements D;
C implements B;
]PRE]

[21] ただし[[左辺]]が[[補助的インターフェイス]]であるような [CODE(IDL)[[[implements]]]]
は[RUBYB[勧められていません]@en[discouraged]] [SRC[>>10]]。
([[推移的]]に適用されるような [CODE(IDL)@en[[[implements]]]] を書くべきではありません。)

;; [22] 実際にはそのような例はなさそうです。

[24] [CODE(IDL)@en[[[implements]]]] によって生じる[[メンバー]]の制約については、
[[派生的インターフェイス群]]を参照してください。

* 補助的インターフェイス

[19] ある[[オブジェクト]]が[[実装]]する[[インターフェイス]]のうち、
[CODE(IDL)@en[[[implements]]]] [[文]]の[[右辺]]に指定されているものや、
その[[継承インターフェイス]]のことを、
[DFN[[RUBYB[[[補助的インターフェイス]]]@en[supplemental interface]]]]といいます [SRC[>>10]]。

[20] すなわち、 [CODE(IDL)@en[[[interface]]]] の [CODE[[[:]]]] で表されるような本筋の[[継承]]関係ではなく、
[CODE(IDL)@en[[[implements]]]] によって追加で[[実装]]するよう指定されている[[インターフェイス]]群のことを[[補助的インターフェイス]]と呼んでいます。

[23] [[派生的インターフェイス群]]と似ていますが、[[補助的インターフェイス]]の方がより多くの[[インターフェイス]]が該当します。
[[継承インターフェイス]]の [CODE(IDL)@en[[[implements]]]] は[[補助的インターフェイス]]になりますが、
[[派生的インターフェイス群]]にはなりません。

* 歴史

** [CODE[implements]]

[REFS[
- [1] [CITE[IRC logs: freenode / #whatwg / 20090925]]
([TIME[2009-11-17 00:09:05 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090925#l-110>
]REFS]

[2] [CITE@en[24417 – '''['''Exposed''']''' on an interface that is "implements"ed into another should mean something]]
([TIME[2017-10-14 13:04:53 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=24417>

[3] [CITE@en[Update WebIDL definition(s) to use new mixin syntax · Issue #532 · whatwg/dom]]
([TIME[2017-12-20 23:50:32 +09:00]])
<https://github.com/whatwg/dom/issues/532>

[4] [CITE@en[Use Web IDL's new-ish interface mixins concept]]
([[romandev]]著, [TIME[2017-12-21 05:39:18 +09:00]])
<https://github.com/whatwg/html/commit/c8867a179c21134021dc3435e98c1b9c4542d794>

[5] [CITE@en[interface: use Web IDL's new-ish interface mixins concept (#1176)]]
([[romandev]]著, [TIME[2017-12-21 19:09:10 +09:00]])
<https://github.com/w3c/webdriver/commit/d50bdf0c0d6cac5e54cdedc263df3cc2cba173f9>

[6] [CITE@en[Add support for interface mixins]]
([[tobie]]著, [TIME[2017-10-11 16:48:12 +09:00]])
<https://github.com/heycam/webidl/commit/45e8173d40ddff8dcf81697326e094bcf8b92920>

[7] [CITE@en[The spec's wording for where to place operations is broken and confusing · Issue #164 · heycam/webidl]]
([TIME[2017-12-23 15:32:16 +09:00]])
<https://github.com/heycam/webidl/issues/164>

[8] [CITE@en[25495 – Behavior of no '''['''Exposed''']''' on interface members is weird]]
([TIME[2017-12-23 15:33:57 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=25495>

[9] [CITE@en[Designing mixins · Issue #363 · heycam/webidl]]
([TIME[2017-12-23 15:50:08 +09:00]])
<https://github.com/heycam/webidl/issues/363>

- [10] [CITE[Web IDL (Second Edition)]] ([TIME[2014-02-10 21:45:38 +09:00]] 版) <http://heycam.github.io/webidl/#idl-implements-statements>


[25] [CITE@en[Define "implements" checks using internal slots]]
([[littledan]]著, [TIME[2019-02-25 23:52:58 +09:00]])
<https://github.com/heycam/webidl/commit/d534bbefd52182e09594bb7c4c229dd24b4251c0>

[27] [CITE@en[Add '''[''''''['''PlatformBrand''']'''''']''' internal slot to all platform objects · Issue #97 · heycam/webidl]]
([TIME[2019-06-21 17:13:23 +09:00]])
<https://github.com/heycam/webidl/issues/97>

[28] [CITE@en[Define "implements" checks using internal slots by Ms2ger · Pull Request #654 · heycam/webidl]]
([TIME[2019-06-21 17:14:48 +09:00]])
<https://github.com/heycam/webidl/pull/654>