2016-09-28 63 views
1

考慮我們有三個類從基部CLASSE繼承,形狀,其基類和其它兩個類圓和文本(形狀)上溯造型&向下轉換在C#

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 
    { 

    } 
} 

大家都知道,上溯造型總是成功的,我們從子類引用創建一個基類的引用

Text txt = new Text(); 
Shape shape = txt //upcast 

和向下轉換可能會拋出和InvalidCastException的例如

Text txt = new Text(); 
Shape shape = txt; //upcast 
Circle c = (Circle)shape; //DownCast InvalidCastException 

什麼我」我感到困惑的是,我們可能需要上/下投與對象的情況/案例是什麼?

回答

4

通常情況下,您將存儲在例如列表中的對象使用向上轉換。 (共享的基本類型,甚至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.. 
    } 

} 

的一件事是,CircleTextShape ,但是不能將Circle投射到Text。這是因爲這兩個類都在擴展Shape類,並添加了不同的功能/屬性。

例如:一個CarBike分享他們同基地Vihicle一個Bike(用於運送人員或貨物,特別是對土地的事情),但擴展了Vihicle有鞍式和Car延伸與廂體例如電機。因此,它們不能彼此「鑄造」,但都可以被看作Vihicle


有此有用的擴展方法,它處理的類型檢查:

foreach(Circle circle in shapes.OfType<Circle>()) 
{ 
    // only shapes of type Circle are iterated. 
} 

'真實世界' 例如:

如果你有一個窗口,有它有很多控制。像標籤/按鈕/ ListViews /等。所有這些控件都存儲在它們的基本類型的集合中。

例如WPF控件:所有子控件(在FrameWorkElement中)都存儲在UIElementCollection中。因此,所有添加的子控件必須來自UIElement

當你遍歷所有子控件,(的UIElement的)和搜索例如標籤,你必須檢查它的類型:

foreach(UIElement element in this.Children) 
{ 
    if(element is Label) 
    { 
     Label myLabel = (Label)element; 
     myLabel.Content = "Hi there!"; 
    } 
} 

這個循環將改變所有標籤(在此)到'你好!'。

+0

你想提一下現實世界中使用上傳和向下轉換的例子嗎?謝謝 –

+0

很好的答案。寫得好。 – Enigmativity