Ich bin neu in C # (und OOP ). Wenn ich Code wie den folgenden habe:
class Employee
{
// some code
}
class Manager : Employee
{
//some code
}
Frage 1 : Wenn ich einen anderen Code habe, der dies tut:
Manager mgr = new Manager();
Employee emp = (Employee)mgr;
Hier Employee
ist ein Manager
, aber wenn ich es so auf ein Employee
besetze, bedeutet das, dass ich es übertrage?
Frage 2 :
Wenn ich mehrere Employee
Klassenobjekte habe und einige, aber nicht alle von ihnen sind Manager
, wie kann ich sie nach Möglichkeit herunterwerfen?
Employee emp= mgr;
ausreichen.Antworten:
Das ist richtig. Wenn Sie dies tun, wandeln Sie es in ein
employee
Objekt um, sodass Sie auf nichts Manager-spezifisches zugreifen können.Beim Downcasting nehmen Sie eine Basisklasse und versuchen dann, sie in eine spezifischere Klasse umzuwandeln. Dies kann mit is und einer expliziten Besetzung wie dieser erreicht werden:
oder mit dem
as
Betreiber wie folgt:Wenn etwas unklar ist, werde ich es gerne korrigieren!
quelle
as
Operator anstelle von verwendenis
, gefolgt von einer Besetzung.Das Upcasting (Verwenden
(Employee)someInstance
) ist im Allgemeinen einfach, da der Compiler Ihnen beim Kompilieren mitteilen kann, ob ein Typ von einem anderen abgeleitet ist.Das Downcasting muss jedoch im Allgemeinen zur Laufzeit erfolgen, da der Compiler möglicherweise nicht immer weiß, ob die betreffende Instanz vom angegebenen Typ ist. C # bietet zwei Betreiber für diese - ist , was Sie , wenn die niedergeschlagenen Werke erzählt, und wahr / falsch zurück. Und wie versucht, die Umwandlung durchzuführen und gibt den richtigen Typ zurück, wenn möglich, oder null, wenn nicht.
So testen Sie, ob ein Mitarbeiter ein Manager ist:
Sie können dies auch verwenden
quelle
In deinem Fall
Sie machen eine Übertragung.
Ein Upcast ist immer erfolgreich, im Gegensatz zu einem Downcast, für den eine explizite Umwandlung erforderlich ist, da er zur Laufzeit möglicherweise fehlschlagen kann ( InvalidCastException ).
C # bietet zwei Operatoren, um zu vermeiden, dass diese Ausnahme ausgelöst wird:
Ab:
Zuerst:
Zweite:
Warnung : Wenn Sie einen Upcast ausführen, können Sie nur auf die Methoden, Eigenschaften usw. der Oberklasse zugreifen.
quelle
Wenn Sie jedes Employee-Objekt überprüfen müssen, ob es sich um ein Manager-Objekt handelt, verwenden Sie die OfType-Methode:
quelle
Antwort 1: Ja, es heißt Upcasting, aber die Art und Weise, wie Sie es tun, ist nicht modern. Upcasting kann implizit durchgeführt werden, Sie benötigen keine Konvertierung. Schreiben Sie einfach Employee emp = mgr; ist genug für die Übertragung.
Antwort 2: Wenn Sie ein Objekt der Manager-Klasse erstellen, können wir sagen, dass der Manager ein Mitarbeiter ist. Weil Klasse Manager: Mitarbeiter stellen Is-A - Beziehung zwischen Klasse Employee und Manager - Klasse. Wir können also sagen, dass jeder Manager ein Mitarbeiter ist.
Wenn wir jedoch ein Objekt der Employee-Klasse erstellen, können wir nicht sagen, dass dieser Mitarbeiter Manager ist, da die Klasse Employee eine Klasse ist, die keine andere Klasse erbt. Sie können dieses Employee Class-Objekt also nicht direkt auf das Manager Class-Objekt übertragen.
Die Antwort lautet also: Wenn Sie vom Employee Class-Objekt zum Manager Class-Objekt downcasten möchten, müssen Sie zuerst ein Objekt der Manager Class haben, dann können Sie es upcasten und dann können Sie es downcasten.
quelle
Upcasting und Downcasting:
Upcasting: Casting von der abgeleiteten Klasse zur Basisklasse Downcasting: Casting von der Basisklasse zur abgeleiteten Klasse
Lassen Sie uns das gleiche als Beispiel verstehen:
Betrachten Sie zwei Klassen Shape als meine übergeordnete Klasse und Circle als abgeleitete Klasse, die wie folgt definiert sind:
Upcasting:
Form s = neue Form ();
Kreis c = s;
Sowohl c als auch s verweisen auf denselben Speicherort, aber beide haben unterschiedliche Ansichten. Mit der Referenz "c" können Sie auf alle Eigenschaften der Basisklasse und der abgeleiteten Klasse zugreifen, aber mit der Referenz "s" können Sie auf Eigenschaften zugreifen der einzigen Elternklasse.
Ein praktisches Beispiel für Upcasting ist die Stream-Klasse, die eine Grundklasse aller Arten von Stream-Readern des .net-Frameworks darstellt:
StreamReader reader = neuer StreamReader (neuer FileStreamReader ());
Hier wird FileStreamReader () auf streadm reder übertragen.
Downcasting:
Form s = neuer Kreis (); Wie oben erläutert, ist die Ansicht von s der einzige Elternteil. Um sie sowohl für Eltern als auch für ein Kind zu erstellen, müssen wir sie herunterstoßen
var c = (Kreis) s;
Das praktische Beispiel für Downcasting ist die Button-Klasse von WPF.
quelle