这两项任务有什么区别? A继承自Base。
Base b = new A();
A c = new A();
我不明白为什么会这样,如果第二个被声明为A型。
List<Base> vals = new List<Base>();
values.Add(b);
values.Add(c);
我应该查找什么来更好地理解这一点?
答案 0 :(得分:2)
继承构成是关系:如果A
继承Base
,则意味着A
可以转到允许Base
的任何地方。这正是您的代码段所显示的内容:您可以将A
的实例Base
的子类添加到List<Base>
,其中任何子类{{1} 1}}可以去。
答案 1 :(得分:1)
这是因为继承是传递性的。 As MSDN puts it:
如果ClassC派生自ClassB,而ClassB派生自ClassA,则ClassC继承ClassB和ClassA中声明的成员。
因此,在您的情况下,由于A
继承自Base
,A
“是一个”Base
,因此可以添加到List<Base>
;该列表的每个元素都是Base
。
答案 2 :(得分:0)
这两个陈述对我来说很清楚。因为在第一个中,我们有一个原始对象Base,就像一个专门化一样。而在第二个中,A就像它自己的类型一样。您必须记住的是A类型也是Base类型。此功能称为多态。 您可以在http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
中阅读更多内容答案 3 :(得分:0)
将val添加到val时,编译器会自动将c转换为Base 在OOP中 - &gt;从孩子到parrent的铸造=&gt;没关系
答案 4 :(得分:0)
Base b = new A();
由于工具Base这是有效的。
b只有Base的属性和方法。
但不同之处在于您可以将b转换为A,然后使用A的属性和方法。
答案 5 :(得分:0)
关于继承的这些问题是C#和任何面向对象语言的基础。 你应该从一本好书开始Pro C# 5.0 and the .NET 4.5 Framework, Sixth Edition 或者像Microsoft C# tutorials这样的免费在线教程 或者c#他们到处都是...... 如果你认真学习和喜欢教学视频。 请查看www.pluralsight.com大约30美元/月,您可以获得专家的精彩视频。 50美元/月,您可以下载练习。
回到你的问题。生病交换A和B
//Base Class A is Animal. Class B might be a Bird.
Animal A = new bird(); // but A has visibility of or can access the features common to all animals Ie access a bird but with a narrower view.
Bird C = new Bird() ; works for the obvious reason.
but thats just the beginning...
您需要考虑抽象和虚拟类和属性。 覆盖属性。 由于您的示例有一个列表,您甚至可能遇到COVARIANCE问题。
事实上跳得更深...... http://msdn.microsoft.com/en-us/vstudio/ee672314 协方差和逆差。只是想品尝一下。
最近(在过去的12个月内)学习了c#,我建议如果你是认真的,按照上面建议的书或视频课程的方式工作。 如果你搜索,你会发现有关c#问题的大量信息。
如果你是一个偶然的兴趣,我不知道该建议什么。