'apple'が 'fruit'のサブクラスである場合、List<apple>
はList<fruit>
のサブクラスです。派生オブジェクトのテンプレートは基本タイプのテンプレートのサブクラス
答えて
番号List<apple>
およびList<fruit>
は関連していません。これらの両方のクラスは完全に異なる実装を持つことができ、一方を他方に変換する方法はありません。例えば、List<>
テンプレートは、List<T>
テンプレートとはまったく異なる構造を持つapple
に対して何らかの方法で特殊化することができます。
実装が互換性があっても、List<apple>
をList<fruit>
として扱うことは悪い考えです。その後、リンゴを含むと考えられていたリストにすべての種類の果物を入れ始めるからです。このentry in the C++ FAQ Liteも参照してください。
質問はちょっと混乱しますが、私の最初の回答は少なくとも普通のプログラミング言語ではではありません。です。 の任意の変形もBの同じ変化のサブクラスであることを意味するものではないBをサブクラス。
いいえ! Mutable容器はちょうどそのようには機能しません - 実際にはOOPの魅力的な側面です。
List<fruit>
には、List<apple>
にバナナを挿入することはできません。 Liskovの原則に違反して、あなたがサブクラス化していないことが証明されます。
変更不可能なのコンテナは実際には期待通りに機能します(共分散は技術の用語です)。
面白いことに、この魅力的な法則を印刷したことはありませんでした(の世界ではのオブジェクトはあなたがSquare IS-A Rectangleと言うことはできませんが... 不変オブジェクト、はです!) - 私はちょうど経験と観察を通して私自身でそれを思いついた。私はこの文脈で使用する学術的なリファレンスが好きです。だれかがそれを引き出すことができれば;-)
Javaでは、はList<Fruit>
のサブクラスではありません。それらは両方ともタイプList
です。
これを示すいくつかのJavaコードがあります。
import java.util.LinkedList;
import java.util.List;
class Fruit { }
class Apple extends Fruit { }
public class Main {
public static void main(String[] args) {
Fruit fruit = new Fruit();
Apple apple = new Apple();
List<Fruit> fruitList = new LinkedList<Fruit>();
List<Apple> appleList = new LinkedList<Apple>();
System.out.println(fruit.getClass().getSuperclass());
System.out.println(apple.getClass().getSuperclass());
System.out.println(fruitList.getClass().getSuperclass());
System.out.println(appleList.getClass().getSuperclass());
}
}
出力:
class java.lang.Object
class Fruit
class java.util.AbstractSequentialList
class java.util.AbstractSequentialList
これは、適切なsupを持っていないjavaでのみ当てはまりますジェネリックのポート(型消去を使用)。たとえば、.NET言語ではそうではありません。 –
は、言語に依存します - C#4.0で、あなたがIList<object>
にIList<something>
をキャストすることができるようになりますが、あなたがのためのC#3.0
- 1. C++のテンプレート<基本クラスと派生クラス>
- 2. 派生クラスのテンプレート引数を使用する基本クラス
- 3. 基本タイプのテンプレート特殊化
- 4. が派生し、基本タイプの差別
- 5. 基本クラスの派生オブジェクトの参照
- 6. IDispatch派生クラスのATLテンプレート
- 7. ジャンゴ:基本テンプレート
- 8. 派生したオブジェクトをテンプレートに渡す
- 9. 基本クラスとその派生クラスに限定されたC++テンプレート
- 10. Hippo CMSの基本テンプレート
- 11. ゴランの派生カスタムタイプの基本タイプのメソッドを再利用
- 12. クラスを含むクラスから派生したテンプレート引数が基本クラス
- 13. テンプレート関数を基本型と派生型に限定しますか?
- 14. C++テンプレートと派生クラス
- 15. 派生クラスのテンプレートの特殊化
- 16. テンプレートは派生型と基底を一致させます
- 17. 基本クラスのオブジェクトの派生クラスの呼び出しメソッド
- 18. 検索派生テンプレートの種類
- 19. テンプレート10:ハンバーガー基本UI
- 20. 基本的な残りのテンプレートの例
- 21. 抽象テンプレートの基本クラスへのポインタ?
- 22. 派生クラスへの基本クラスのキャスト
- 23. は、テンプレート引数から派生し、
- 24. 派生クラスのコンストラクタの引数型に応じた基本クラスのテンプレートのインスタンス化
- 25. 基本クラスとしてのC++テンプレートparam
- 26. 基本クラスの派生クラスオブジェクトを使用
- 27. 基本クラスと派生クラスのコンストラクタ
- 28. 利用派生クラス派生クラスは、基本クラス
- 29. テンプレートを展開する前のテンプレートの基本クラスへのアクセスは、
- 30. "派生クラス"タイプのオブジェクトの作成
1をそれを行うことはできません専門用語... –
として "共分散"を指摘すると、コンテキスト、共分散および反差異に応じて、.NET 4.0で許可されます(http://msdn.microsoft.com/en-us/library/dd465120(VS.100) ).aspx) –