回答編集履歴

1

サブクラス->親クラス

2016/04/07 14:27

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -166,7 +166,7 @@
166
166
 
167
167
 
168
168
 
169
- * PHPのtraitは本物のトレイトです。平坦化されるためmixinではありません。(Scalaのtraitは名前に反して、トレイトではなくmixinです。)
169
+ * PHPのtraitは本物のトレイトです。平坦化されるためmixinではありません。トレイトはmixinと違い継承関係(is-a)を持ちません。(Scalaのtraitは名前に反して、トレイトではなくmixinです。)
170
170
 
171
171
  * Javaでは、interfaceでdefault付きメソッドを定義することで、mixinに近い事が実現できます。しかし、interfaceは実装する(implement)ものであり、mixinではありませんし、フィールド定義ができないなどの制限があります。
172
172
 
@@ -182,7 +182,7 @@
182
182
 
183
183
 
184
184
 
185
- Pythonの多重継承では探索順位を決め、衝突した場合でも、大丈夫のようにしています。
185
+ 衝突時のルールを言語仕様としてきちんと決めていれば、駄目ではありません。例えば、Pythonの多重継承では探索順位を決め、衝突した場合でも、大丈夫のようにしています。(ただし、Pythonでは、後を上書きでは無く、前に定義されたものから探索になります)
186
186
 
187
187
 
188
188
 
@@ -324,7 +324,7 @@
324
324
 
325
325
 
326
326
 
327
- 上のコードはPythonとほぼ同じ事をしているはずなのにコンパイルエラーになります。まず、`x.b()`がエラーになるのは、C++ではPythonのようにサブクラスに優先順位が無いため、B0とB1のどちらを使えばいいのかわからないからです。`x.a()`も同じです。C++では、B0経由のAとB1経由のAの二つのAが存在し、a()も二つ持つことになります。これもどちらを使えば良いのかわからないため、エラーになります。ただ、キャストして型を明示すれば一応解決できます。例えば`static_cast<B0>(x).b()`とすればいいのです。他にも、virtualを使うなどでAを一つだけにする方法があります。
327
+ 上のコードはPythonとほぼ同じ事をしているはずなのにコンパイルエラーになります。まず、`x.b()`がエラーになるのは、C++ではPythonのようにクラスに優先順位が無いため、B0とB1のどちらを使えばいいのかわからないからです。`x.a()`も同じです。C++では、B0経由のAとB1経由のAの二つのAが存在し、a()も二つ持つことになります。これもどちらを使えば良いのかわからないため、エラーになります。ただ、キャストして型を明示すれば一応解決できます。例えば`static_cast<B0>(x).b()`とすればいいのです。他にも、virtualを使うなどでAを一つだけにする方法があります。
328
328
 
329
329
 
330
330