这两个任务有什么区别?A 继承自 Base。
Base b = new A();
A c = new A();
如果第二个被声明为 A 型,我不明白为什么会这样。
List<Base> vals = new List<Base>();
values.Add(b);
values.Add(c);
我应该查找什么以了解更多信息?
这两个任务有什么区别?A 继承自 Base。
Base b = new A();
A c = new A();
如果第二个被声明为 A 型,我不明白为什么会这样。
List<Base> vals = new List<Base>();
values.Add(b);
values.Add(c);
我应该查找什么以了解更多信息?
继承构成了一个is关系:如果A
继承Base
,则表示A
可以去任何Base
允许去的地方。这正是您的代码片段所显示的内容:您可以将 的实例A
,的子类添加Base
到任何子类都可以去的List<Base>
地方。Base
这是因为继承是可传递的。正如 MSDN 所说:
如果 ClassC 是从 ClassB 派生的,而 ClassB 是从 ClassA 派生的,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。
因此,在您的情况下,由于A
继承自Base
, A
"is-a" Base
,因此可以添加到 a List<Base>
; 该列表的每个元素都是一个Base
.
这两个陈述对我来说很清楚。因为首先,我们有一个原始对象 Base,它像一个专业化一样被实例化。在第二个中,A 像它自己的类型一样被实例化。您必须记住的是 A 类型也是 Base 类型。这个特性被称为多态性。您可以在http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming中阅读更多内容
当您将 C 添加到 vals 时,编译器会自动将 c 强制转换为 Base In OOP -> 从子级强制转换为父级 => 没关系
Base b = new A();
由于 A implement Base 这是有效的。
b 将只有 Base 的属性和方法。
但不同的是,您可以将 b 强制转换为 A,然后使用 A 的属性和方法。
这些关于继承的问题是 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# 问题的信息。
如果您的兴趣是偶然的,那么我不知道该建议什么。