teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

少し修正

2016/01/31 01:54

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -27,18 +27,18 @@
27
27
 
28
28
  なお、トレイトはインターフェースと違い、他のトレイトを拡張(extends)するようなことは出来ないようにしているので、ダイヤモンド継承問題のような複雑な使用を覚える必要はありません(入れ子にはできます)。また、いわゆる**Mixin**に近いような動作になりますが、PHPのトレイトはMixinとは違い平坦に展開されます。トレイトは継承するものではなく、使うものなのです。そのため、`instanceof`でトレイトが含まれているかどうかを検知できませんが、その役割をインターフェースに受け渡すことで、インターフェースが無用の長物にならないよう言語全体のバランスを取っています。
29
29
 
30
- ###他の言語
30
+ ###他の言語(参考)
31
31
  他の言語にも似たような仕組みがありますが、詳細は異なります。
32
32
 
33
33
  * 多重継承であるC++には、抽象クラスはありますが、インターフェースとトレイトはありません。
34
34
  * 単一継承であるC#には、抽象クラスとインターフェースがありますが、トレイトはありません。Mixinしたい場合は、拡張メソッドとConditinalWeakTableを組み合わせることで同じようなことが出来るようです。
35
35
  * 単一継承であるJavaには、抽象クラスとインターフェースがありますが、トレイトはありません。ただし、Java8からはインターフェースでメソッドを具体的に実装することが可能になったため、Mixinができるようになりました。
36
- * 単一継承であるScalaには、抽象クラスとトレイトのみで、トレイトがインターフェースの役割を兼ねています。なお、Scalaのトレイトは実質Mixinで
36
+ * 単一継承であるScalaには、抽象クラスとトレイトのみで、トレイトがインターフェースの役割を兼ねています。なお、Scalaのトレイトは実質Mixinであり、**真のトレイトではありません**
37
37
  * 多重継承であるPythonには、言語仕様としては抽象クラスもインターフェースもトレイトもありません。しかし、標準で入っているabcモジュールを使うことで抽象クラスを実現できます。
38
38
  * 単一継承であるRubyには、抽象クラスもインターフェースもトレイトありませんが、モジュール(Module)によるMixinがその役割を担っています。ただし、モジュールのMixinだけでは実装を強制することは出来きません。
39
39
 
40
- 多重継承が可能な場合、抽象クラスでインターフェースやトレイトの役割を担うことが出来ますので、多重継承の言語では通常インターフェースもトレイトもありません。
40
+ 多重継承が可能な場合、抽象クラスでインターフェースやトレイトの役割を担うことが出来ますので、多重継承の言語では通常インターフェースもトレイトもありません。その代わり、多重継承ではダイヤモンド継承問題など複雑な仕様を学ぶ必要があります。
41
41
 
42
- PythonやRubyのようなスクリプト言語では、抽象クラスなどが持つ「実装の強制」が言語仕様としてはありません。コンパイルという課程がなく、動的な言語なため、解析時エラーでも実行時エラーでもあまり変わらないという思想から来ているのかもしれません。ただ、近年はスクリプト言語でも静的解析によるエラー検出が重要視されています。Pythonには標準でモジュールが提供されていますし、Rubyも今後開発される3.0系では実装される可能性があります。つまり、**PHPは時代を先取りしているのです!**
42
+ PythonやRubyのようなスクリプト言語では、抽象クラスなどが持つ「実装の強制」が言語仕様としてはありません。コンパイルという課程がなく、動的な言語なため、解析時エラーでも実行時エラーでもあまり変わらないという思想から来ているのかもしれません。ただ、近年はスクリプト言語でも静的解析によるエラー検出が重要視されています。Pythonには標準でモジュールが提供されていますし、Rubyも今後開発される3.0系では実装される可能性があります。つまり、**PHPは時代を先取りしていす!**
43
43
 
44
44
  なお、ここまで読んで、「動的型付けのスクリプト言語で、ここまで型継承や実装強制を意識する必要があるのか?」とか「トレイトがあれば抽象クラスもインターフェースはいらないのでは?」とは思ってはいけません。そう思う時点でPHPer失格です。PHPを愛する私達は、**そんなところも含めてPHPを愛する必要があるのです!**

1

誤字脱字の修正

2016/01/31 01:54

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -31,8 +31,8 @@
31
31
  他の言語にも似たような仕組みがありますが、詳細は異なります。
32
32
 
33
33
  * 多重継承であるC++には、抽象クラスはありますが、インターフェースとトレイトはありません。
34
- * 単一継承であるC#には、抽象クラスとインターフェースがありますが、トレイトはありません。Mixinしたい場合は、拡張メソッドとConditinalWeakTableを組み合わせることで同じようなこと出来るようです。
34
+ * 単一継承であるC#には、抽象クラスとインターフェースがありますが、トレイトはありません。Mixinしたい場合は、拡張メソッドとConditinalWeakTableを組み合わせることで同じようなこと出来るようです。
35
- * 単一継承であるJavaには、抽象クラスとインターフェースがありますが、トレイトはありません。ただし、Java8からはインターフェースメソッドを実装することが可能になったため、Mixinができるようになりました。
35
+ * 単一継承であるJavaには、抽象クラスとインターフェースがありますが、トレイトはありません。ただし、Java8からはインターフェースメソッドを具体的に実装することが可能になったため、Mixinができるようになりました。
36
36
  * 単一継承であるScalaには、抽象クラスとトレイトのみで、トレイトがインターフェースの役割を兼ねています。なお、Scalaのトレイトは実質Mixinです。
37
37
  * 多重継承であるPythonには、言語仕様としては抽象クラスもインターフェースもトレイトもありません。しかし、標準で入っているabcモジュールを使うことで抽象クラスを実現できます。
38
38
  * 単一継承であるRubyには、抽象クラスもインターフェースもトレイトありませんが、モジュール(Module)によるMixinがその役割を担っています。ただし、モジュールのMixinだけでは実装を強制することは出来きません。