2

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

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

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

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

我应该查找什么以了解更多信息?

4

6 回答 6

2

继承构成了一个is关系:如果A继承Base,则表示A可以去任何Base允许去的地方。这正是您的代码片段所显示的内容:您可以将 的实例A,的子类添加Base任何子类都可以去的List<Base>地方。Base

于 2012-11-30T02:47:25.283 回答
1

这是因为继承是可传递的。正如 MSDN 所说

如果 ClassC 是从 ClassB 派生的,而 ClassB 是从 ClassA 派生的,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。

因此,在您的情况下,由于A继承自Base, A"is-a" Base,因此可以添加到 a List<Base>; 该列表的每个元素都是一个Base.

于 2012-11-30T02:48:07.920 回答
0

这两个陈述对我来说很清楚。因为首先,我们有一个原始对象 Base,它像一个专业化一样被实例化。在第二个中,A 像它自己的类型一样被实例化。您必须记住的是 A 类型也是 Base 类型。这个特性被称为多态性。您可以在http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming中阅读更多内容

于 2012-11-30T02:51:10.440 回答
0

当您将 C 添加到 vals 时,编译器会自动将 c 强制转换为 Base In OOP -> 从子级强制转换为父级 => 没关系

于 2012-11-30T02:53:45.170 回答
0
Base b = new A(); 

由于 A implement Base 这是有效的。

b 将只有 Base 的属性和方法。

但不同的是,您可以将 b 强制转换为 A,然后使用 A 的属性和方法。

于 2012-11-30T02:57:44.963 回答
0

这些关于继承的问题是 C# 以及任何面向对象语言的基础。你应该从一本好书 Pro C# 5.0 and the .NET 4.5 Framework, Sixth Edition 或一些免费的在线教程开始,比如Microsoft C# 教程 或这里的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# 问题的信息。

如果您的兴趣是偶然的,那么我不知道该建议什么。

于 2012-11-30T03:15:18.260 回答