96 votes

downcast et upcast

Je suis nouveau sur le C# (et de la programmation orientée objet). Quand j'ai le code suivant:

class Employee
{
    // some code
}


class Manager : Employee
{
    //some code
}

Question 1: si j'ai un autre code qui fait cela:

   Manager mgr = new Manager();
   Employee emp = (Employee)mgr;

Ici employé est un gestionnaire, mais quand je lance ça comme ça à un Employee il signifie que je suis upcasting il?

Question 2:

Lorsque j'ai plusieurs Employee des objets de la classe et certains mais pas tous d'entre eux sont Managers', comment puis-je abattu dans la mesure du possible?

103voto

RCIX Points 12049
  1. Qui est correct. Lorsque vous faites cela, vous êtes le jetant dans un "employé" de l'objet, ce qui signifie que vous ne pouvez pas accéder à ce que le gestionnaire spécifique.

  2. Passer est l'endroit où vous prenez une classe de base et puis essayer de le transformer en une classe plus spécifique. Ceci peut être accompli avec l'aide de est et un cast explicite comme ceci:

    if (employee is Manager)
    {
        Manager m = (Manager)employee;
        //do something with it
    }
    

ou avec l'opérateur comme ceci:

Manager m = (employee as Manager);
if (m != null)
{
    //do something with it
}

Si quelque chose n'est pas clair, je serai heureux de le corriger!

51voto

Preet Sangha Points 39414

Upcasting (à l'aide d' (Employee)someInstance) est généralement facile que le compilateur peut vous dire au moment de la compilation si un type est dérivé de l'autre.

Passer cependant doit être fait au moment de l'exécution en général, car le compilateur ne peut pas toujours savoir si l'instance en question est du type donné. C# fournit deux opérateurs pour cela - est qui vous indique si les humbles travaux, et retourner true/false. Et comme qui tente de faire le casting et retourne le type correct si possible, ou null si pas.

Pour tester si un employé est un gestionnaire de:

Employee m = new Manager();
Employee e = new Employee();

if(m is Manager) Console.WriteLine("m is a manager");
if(e is Manager) Console.WriteLine("e is a manager");

Vous pouvez également utiliser cette

Employee someEmployee = e  as Manager;
    if(someEmployee  != null) Console.WriteLine("someEmployee (e) is a manager");

Employee someEmployee = m  as Manager;
    if(someEmployee  != null) Console.WriteLine("someEmployee (m) is a manager");

7voto

HOKBONG Points 419

Si vous devez vérifier si chaque objet Employé est un objet Manager, utilisez la méthode OfType:

 List<Employee> employees = new List<Employee>();

//Code to add some Employee or Manager objects..

var onlyManagers = employees.OfType<Manager>();

foreach (Manager m in onlyManagers) {
  // Do Manager specific thing..
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X