abattu et sortie
Je suis nouveau sur C# (et OOP). 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 Employee
est un Manager
, mais quand je lance ça comme ça pour un Employee
cela signifie que je suis upcasting il?
Question 2:
Lorsque j'ai plusieurs Employee
les objets de la classe et certains mais pas tous d'entre eux sont Manager
's, comment puis-je abattu dans la mesure du possible?
- Upcasting peut être fait sans cast explicite. Donc
Employee emp= mgr;
devrait suffire.
Vous devez vous connecter pour publier un commentaire.
Qui est correct. Lorsque vous faites cela, vous êtes le jetant dans un
employee
objet, ce qui signifie que vous ne pouvez pas accéder à ce que le gestionnaire spécifique.De passer 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:
ou avec la
as
opérateur comme ceci:Si quelque chose n'est pas clair, je serai heureux de le corriger!
as
opérateur au lieu deis
, suivi par un casting.Upcasting (à l'aide de
(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.De 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 ce - 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:
Vous pouvez également utiliser cette
Dans votre cas
vous faites un upcasting.
Une sortie toujours réussit à la différence d'une triste qui nécessite un cast explicite, car il peut éventuellement échouer au moment de l'exécution.(InvalidCastException).
C# offre deux opérateurs pour éviter cette exception:
À partir de:
Première:
Deuxième:
Avertissement: Quand vous faites une sortie, vous pouvez uniquement accéder à la super-classe de méthodes, propriétés, etc...
Dans le cas où vous avez besoin de vérifier chaque Employé de l'objet si il est un Gestionnaire d'objets, l'utilisation de la OfType méthode:
Réponse 1 :
Oui, il a appelé upcasting mais la manière de le faire n'est pas d'une façon moderne. Upcasting peut être effectuée implicitement vous n'avez pas besoin de conversion. Donc, juste l'écriture des Employés d'emp = mgr;
est assez pour upcasting.
Réponse 2 :
Si vous créez un objet de Gestionnaire de la classe, nous pouvons dire que le gestionnaire est un employé. Parce que Gestionnaire de classe : Employé représente relation " Est-Un entre la Classe Employé et le Gestionnaire de Classe. On peut donc dire que chaque manager est un employé.
Mais si l'on créer un objet de la classe Employee, on ne peut pas dire que cet employé est de manager car classe Employé est une classe qui n'est pas hériter d'une autre classe. Vous ne pouvez donc pas directement abattu que des Employés de la Classe de l'objet pour le Gestionnaire de la Classe de l'objet.
Donc la réponse est, si vous voulez abattu d'un Employé de la Classe de l'objet pour le Gestionnaire de la Classe de l'objet, vous devez d'abord avoir un objet de Gestionnaire de Classe d'abord, puis vous pouvez sortie et ensuite vous pouvez abattu il.
Upcasting et de Passer:
Upcasting: Casting à partir de Dérivés de la Classe à la Classe de Base
Passer: Casting de la Classe de Base de la Classe Dérivée
Nous allons comprendre la même chose qu'un exemple:
Considérons deux classes de Forme comme Mes parents de la classe et le Cercle comme une classe Dérivée, définis comme suit:
Upcasting:
De la forme s = new Shape();
Cercle c= s;
C et s sont de référencement pour le même emplacement de mémoire, mais tous les deux ont des vues différentes, j'.e avec le "c" de référence, vous pouvez accéder à toutes les propriétés de la classe de base et la classe dérivée, mais à l'aide de "s" à la référence, vous pouvez accéder aux propriétés de la seule classe parent.
Un exemple pratique de l'upcasting est classe de Flux qui est baseclass de tous les types de lecteur de flux de .net framework:
StreamReader reader = new StreamReader(nouveau FileStreamReader());
ici, FileStreamReader() est upcasted à streadm reder.
De passer:
De la forme s = new Cercle();
ici, comme expliqué ci-dessus, vue de s est le seul parent, afin d'en faire pour les deux parents et un enfant, nous devons abattu il
var c = (Cercle) s;
L'exemple pratique de Passer est le bouton de classe de WPF.