Manipulation Types

型別操作

型別操作

轉型的內容不多,主要就分為自動轉型、手動轉型以及型別判斷,以下為程式範例:

我先建立三個有階層關係的類別,且建立一個可傳入Animal型別的方法

public class Animal
{
    public int Life { get; set; }
}
public class Dog : Animal 
{
    public string Name { get; set; }
}
public class Poodle : Dog 
{
    public string Groomer { get; set; }
}
static void Main(string[] args)
{            
    Animal animal = new Animal();
    Dog dog = new Dog();
    Poodle poodle = new Poodle();

    //animal, dog, poodle 都可傳入
    TakeAnimal(dog);
}

// 可傳入Animal類別以及其衍生類別,且會自動轉型為Animal
private static void TakeAnimal(Animal animal) 
{
    // 因為轉型後為Animal,所以只能用Animal的方法
    Console.WriteLine(animal.Life);
}

手動轉型

static void Main(string[] args)
{            
    Animal animal = new Animal();
    Dog dog = new Dog();
    Poodle poodle = new Poodle();
    
    TakeAnimal(dog);
}

// 可傳入Animal類別以及其衍生類別,且會自動轉型為Animal
private static void TakeAnimal(Animal animal) 
{
    // 雖然參數的型別是Animal,但是呼叫端的傳入型別是Dog
    // 又因為Dog繼承自Animal,所以可以在這裡將Animal轉型為Dog            

    // 轉型方法一
    // 若轉型失敗會丟出Exception
    Dog dog1 = (Dog)animal;

    // 轉型方法二-(建議)
    // 若轉型失敗dog2 會為 null,不會有Exception
    Dog dog2 = animal as Dog;
    
    /*--------------------------------------------------*/

    // 戶用端傳入的型別為Dog,但是型別只能往上轉,不能往下轉的特性,
    // 所以在這邊沒辦法轉型為poodle
    // 會丟出Exception
    Poodle poodle = (Poodle)animal;

}

型別判斷

static void Main(string[] args)
{            
    Animal animal = new Animal();
    Dog dog = new Dog();
    Poodle poodle = new Poodle();

    TakeAnimal(animal);
}

private static void TakeAnimal(Animal animal)
{
    // 為了防止轉型失敗,所以我會在轉型前做型別判斷
    
    // 判斷方法一
    // 會準確判斷型別是否為Dog,Dog以外類別都為false
    var type = animal.GetType();
    if (type == typeof(Dog))
    {
        var dog = animal as Dog;
    }

    // 判斷方法二-(建議)
    // 若型別為Dog或者Dog的衍生類別(例如Poodle),則為true
    if (animal is Dog)
    {
        var dog = animal as Dog;
    }
}

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。