Csharp/C Sharp/Class Interface/Object Cast — различия между версиями

Материал из .Net Framework эксперт
Перейти к: навигация, поиск
м (1 версия)
 
(нет различий)

Текущая версия на 11:38, 26 мая 2010

Casting Objects

 
using System;
public class MotorVehicle {
    public string model;
    public MotorVehicle(string model) {
        this.model = model;
    }
    public void Start() {
        Console.WriteLine(model + " started");
    }
}
public class Product : MotorVehicle {
    public bool convertible;
    public Product(string model, bool convertible) :
        base(model) {
        this.convertible = convertible;
    }
}

public class Motorcycle : MotorVehicle {
    public bool sidecar;
    public Motorcycle(string model, bool sidecar) :
        base(model) {
        this.sidecar = sidecar;
    }
    public void PullWheelie() {
        Console.WriteLine(model + " pulling a wheelie!");
    }
}
class MainClass {
    public static void Main() {
        Product myProduct = new Product("MR2", true);
        MotorVehicle myMotorVehicle = (MotorVehicle)myProduct;
        Console.WriteLine("myMotorVehicle.model = " + myMotorVehicle.model);
        myMotorVehicle.Start();
        Motorcycle myMotorcycle = new Motorcycle("V-Rod", true);
        MotorVehicle myMotorVehicle2 = (MotorVehicle)myMotorcycle;
        Console.WriteLine("myMotorVehicle2.model =" + myMotorVehicle2.model);
        myMotorVehicle2.Start();
        Motorcycle myMotorcycle2 = (Motorcycle)myMotorVehicle2;
        Console.WriteLine("myMotorcycle2.model = " + myMotorcycle2.model);
        Console.WriteLine("myMotorcycle2.sidecar = " + myMotorcycle2.sidecar);
        myMotorcycle2.Start();
        myMotorcycle2.PullWheelie();
    }
}


Casting objects: downcast

using System;
   
public class CPU {
  public string model;
   
  public CPU(string model) {
    this.model = model;
  }
   
  public void Start() {
    Console.WriteLine(model + " started");
  }
}
   
public class Intel : CPU {
  public bool convertible;
   
  public Intel(string model, bool convertible) : base(model) {
    this.convertible = convertible;
  }
}
   
public class AMD : CPU {
  public bool sidecar;
   
  public AMD(string model, bool sidecar) : base(model) {
    this.sidecar = sidecar;
  }
   
  public void PullWheelie() {
    Console.WriteLine(model + " pulling a wheelie!");
  }
   
}
   
   
class Test {
  public static void Main() {
    Intel myIntel = new Intel("MR2", true);
   
    // create a AMD object
    AMD myAMD = new AMD("V-Rod", true);
   
    // cast myAMD to CPU (upcast)
    CPU myCPU2 = (CPU) myAMD;
   
   
    // cast myCPU2 to AMD (downcast)
    AMD myAMD2 = (AMD) myCPU2;
   
    // myMotorCycle2 has access to all members of the AMD class
    Console.WriteLine("myAMD2.model = " + myAMD2.model);
    Console.WriteLine("myAMD2.sidecar = " + myAMD2.sidecar);
    myAMD2.Start();
    myAMD2.PullWheelie();
  }
}


Casting objects: upcast

using System;
   
public class CPU {
  public string model;
   
  public CPU(string model) {
    this.model = model;
  }
   
  public void Start() {
    Console.WriteLine(model + " started");
  }
}
   
public class Intel : CPU {
  public bool convertible;
   
  public Intel(string model, bool convertible) : base(model) {
    this.convertible = convertible;
  }
}
   
public class AMD : CPU {
  public bool sidecar;
   
  public AMD(string model, bool sidecar) : base(model) {
    this.sidecar = sidecar;
  }
   
  public void PullWheelie() {
    Console.WriteLine(model + " pulling a wheelie!");
  }
   
}
   
   
class Test {
  public static void Main() {
    Intel myIntel = new Intel("MR2", true);
   
    // cast myIntel to CPU (upcast)
    CPU myCPU = (CPU) myIntel;
   
    Console.WriteLine("myCPU.model = " + myCPU.model);
    myCPU.Start();
  }
}


Downcast will fail.

 
class Employee { }
   
class ContractEmployee : Employee { }
   
class CastExample3
{
    public static void Main ()
    {
        ContractEmployee ce = (ContractEmployee)new Employee(); 
    }
}


This code raises an exception at run time because of an invalid cast

 
using System;

public class Starter {
    public static void Main() {
        MyClass obj = new MyClass();
        // Fails at compile time
        // YClass alias=obj;
        // Fails at run time
        YClass alias = (YClass)obj;
        obj.MethodA();
        obj.MethodB();
    }
}
public class MyClass {
    public virtual void MethodA() {
    }
    public virtual void MethodB() {
    }
}
public class YClass : MyClass {
    public override void MethodA() {
    }
}