回答編集履歴
1
サブクラス->親クラス
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のように
|
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
|
|