如果'apple'是'fruit'的子类,那么List<apple>
是List<fruit>
的子类是否正确?是派生对象的模板基类型模板的子类
1
A
回答
2
第List<apple>
和List<fruit>
是无关的。这两个类可能有完全不同的实现,并且没有办法将一个转换为另一个。例如,List<>
模板可能会以某种方式专门用于apple
,它与一般的List<T>
模板具有完全不同的结构。
而且即使实现了兼容,它仍然是一个坏主意,治疗List<apple>
作为List<fruit>
从此人们就开始把各种水果到刚应该包含苹果该列表。另见本entry in the C++ FAQ Lite,大约苹果和香蕉的会谈......
1
的问题是有点迷惑,但我的第一个答案将是没有,至少在一个普通的编程语言。 一个子类b并不暗示的一个任何变化也是b相同变异的子类。
5
不! Mutable容器就是不以这种方式工作 - 实际上是OOP的一个迷人的方面。
进入List<fruit>
你可以插入一个香蕉 - 到List<apple>
,你不能;所以Liskov的原则被违反了,证明你没有继承。
不可变容器确实按预期工作(协方差是艺术术语)。
有趣的是,我从来没有见过这个引人入胜的法则(类似于可变的对象的事实,你不能说一个方形的IS-A矩形......但在世界上不可改变对象,你可以!) - 我只是通过自己的经验和观察来想出它。我很喜欢学术上的参考,如果任何人都可以把它拉起来,BTW ;-)
0
在Java中,不,List<Apple>
不是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
0
取决于语言 - 在C#4.0,你将能够投IList<something>
到IList<object>
,但你不能做它在C#3.0
相关问题
- 1. 模板化基类中的派生类
- 2. 在派生类模板
- 3. 从模板类派生?
- 4. 对象模型设计;基类对派生类的认识
- 5. 模板与其派生类型匹配
- 6. 从模板基类派生类型时未找到
- 7. 将模板函数限制为基类和派生类型?
- 8. Django模板对象类型
- 9. 如何确定一个类型是从模板类派生的?
- 10. C++模板:从基类中调用派生模板类的成员函数
- 11. 如何从模板派生类中的模板化基类调用成员?
- 12. 从模板派生类调用模板基类的构造函数
- 13. 从基指针溯造型到模板派生类型
- 14. 从模板基类派生的类的隐式转换
- 15. 专业类模板方法派生类
- 16. 基类模板的成员超出派生类模板中具有相同模板参数的作用域
- 17. 基本模板类数据成员在派生模板类中不可见?
- 18. 具有模板派生类的基类纯虚函数
- 19. 单独的基类(模板)和派生类(数据)。
- 20. 如何从派生类访问模板基类中的用户定义类型?
- 21. 模板类来区分对象类型?
- 22. 派生类的模板专业化
- 23. 派生模板类对象的实例化
- 24. 模板对象作为模板类
- 25. 模板对象的类型函数
- 26. C++模板:'不是从类型派生的'
- 27. 检测模板类型本身是否是模板类型
- 28. C++模板限于基类及其派生类
- 29. 模板函数,它接受所有派生类型的对象类型和对象
- 30. 从派生模板类调用函数
+1指出“协方差”作为技术术语...... – 2009-06-29 05:53:30
根据上下文,协方差和逆变将被允许在.NET 4.0中(http://msdn.microsoft.com/en-us/library/dd465120(VS.100) ).aspx) – 2009-06-29 05:56:10