c#中这两个变量赋值有什么区别?

时间:2012-11-30 02:44:30

标签: c# oop inheritance

这两项任务有什么区别? A继承自Base。

Base b = new A();
A c = new A();

我不明白为什么会这样,如果第二个被声明为A型。

List<Base> vals = new List<Base>();
values.Add(b);
values.Add(c);

我应该查找什么来更好地理解这一点?

6 个答案:

答案 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继承自BaseA“是一个”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#问题的大量信息。

如果你是一个偶然的兴趣,我不知道该建议什么。