向上倾斜&在C#中向下倾斜

时间:2016-09-28 09:46:11

标签: c# upcasting

考虑我们有三个类,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

我感到困惑的是,我们可能需要向上/向下投射和反对的情境/案例是什么?

1 个答案:

答案 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..
    }

}

有一点是,CircleText都是Shape,但您无法将Circle投射到Text。这是因为两个类都扩展了Shape类并添加了不同的功能/属性。

例如:CarBike共享相同的基础Vihicle (用于运送人员或货物的东西,特别是在陆地上),但是Bike用马鞍延伸VihicleCar用例如马达延伸车辆。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;。