考虑我们有三个类,Shape是基类,还有另外两个类Circle和Text继承自base classe(Shape)
Shape.cs
namespace ObjectOriented
{
public class Shape
{
public int Height { get; set; }
public int Width { get; set; }
public int X { get; set; }
public int Y { get; set; }
public void Draw()
{
}
}
}
Text.cs
using System;
namespace ObjectOriented
{
public class Text : Shape
{
public string FontType { get; set; }
public int FontSize { get; set; }
public void Weirdo()
{
Console.WriteLine("Weird stuff");
}
}
}
Circle.cs
namespace ObjectOriented
{
public class Circle : Shape
{
}
}
我们都知道Upcasting总是成功,我们从子类引用创建对基类的引用
Text txt = new Text();
Shape shape = txt //upcast
和向下转换可能会抛出 InvalidCastException ,例如
Text txt = new Text();
Shape shape = txt; //upcast
Circle c = (Circle)shape; //DownCast InvalidCastException
我感到困惑的是,我们可能需要向上/向下投射和反对的情境/案例是什么?
答案 0 :(得分:4)
通常,您会对存储在例如列表中的对象使用upcasting。 (共享基本类型,甚至可以使用Object
)
List<Shape> shapes = new List<Shape>();
shapes.Add((Shape)new Text()); // <-- the upcast is done automatically
shapes.Add(new Circle());
在向下转型时,您需要检查它是否是正确的类型:
foreach(Shape shape in shapes)
{
if(shape is Circle)
{
Circle circle = (Circle)shape;
// do something..
}
}
有一点是,Circle
和Text
都是Shape
,但您无法将Circle
投射到Text
。这是因为两个类都扩展了Shape
类并添加了不同的功能/属性。
例如:Car
和Bike
共享相同的基础Vihicle
(用于运送人员或货物的东西,特别是在陆地上),但是Bike
用马鞍延伸Vihicle
,Car
用例如马达延伸车辆。Vihicle
。因此,他们不能被铸造&#39;相互之间,但两者都可以被视为foreach(Circle circle in shapes.OfType<Circle>())
{
// only shapes of type Circle are iterated.
}
。
有一些有用的扩展方法,用于处理类型检查:
UIElementCollection
&#39;真实世界&#39;例如:强>
如果你有一个窗口,它上面有很多控件。像标签/按钮/列表视图/等。所有这些控件都存储在其基类型的集合中。
例如WPF控件:所有子控件(在FrameWorkElement中)存储在UIElement
中。因此,作为子添加的所有控件必须派生自foreach(UIElement element in this.Children)
{
if(element is Label)
{
Label myLabel = (Label)element;
myLabel.Content = "Hi there!";
}
}
。
当您迭代所有子控件(UIElement&#39; s)并搜索标签时,您必须检查它的类型:
appSettings
此循环会将所有标签(在此内)更改为&#39;您好!&#39;。