Frage

Ich bin neu in C# (und Oop). Wenn ich einen Code wie folgt 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 an einen wirfle Employee Es bedeutet, dass ich es aufpeppen habe?

Frage 2:

Wenn ich mehrere habe Employee Klassenobjekte und einige, aber nicht alle von ihnen sind Manager'S, wie kann ich sie nach Möglichkeit niederschlagen?

War es hilfreich?

Lösung

  1. Das ist richtig. Wenn Sie das tun, werfen Sie es in eine employee Objekt, das bedeutet also, dass Sie nicht auf etwas Spezifisches Manager zugreifen können.

  2. Dort nehmen Sie eine Basisklasse ein und versuchen, sie in eine spezifischere Klasse zu verwandeln. Dies kann mit der Verwendung von IS und einer expliziten Besetzung wie folgt erreicht werden:

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

oder mit dem as Bediener wie diesen:

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

Wenn etwas unklar ist, werde ich es gerne korrigieren!

Andere Tipps

Upcast (Verwendung (Employee)someInstance) ist im Allgemeinen einfach, da der Compiler Ihnen zum Kompilierungszeitpunkt feststellen kann, ob ein Typ von einem anderen abgeleitet ist.

Niederschlag Im Allgemeinen muss jedoch im Allgemeinen durchgeführt werden, da der Compiler möglicherweise nicht immer weiß, ob die fragliche Instanz der Art ist. C# liefert dafür zwei Betreiber - ist Das sagt Ihnen, ob der niedergeschlagene funktioniert und true/false zurückgibt. Und wie Welches versucht, die Besetzung zu erledigen und gibt nach Möglichkeit den richtigen Typ zurück oder null, wenn nicht.

Um zu testen, ob ein Mitarbeiter ein Manager ist:

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");

Sie können dies auch verwenden

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");
  • Upcast ist eine Operation, die eine Basisklassenreferenz aus einer Unterklasse -Referenz erstellt. (Unterklasse -> Superklasse) (IE Manager -> Mitarbeiter)
  • Niederschlag ist eine Operation, die eine Unterklasse -Referenz aus einer Basisklassenreferenz erstellt. (Superklasse -> Unterklasse) (IE -Mitarbeiter -> Manager)

In Ihrem Fall

Employee emp = (Employee)mgr; //mgr is Manager

Sie machen ein Upcast.

Ein Upcast ist immer erfolgreich wie ein Downcast, der eine explizite Besetzung erfordert, da er möglicherweise zur Laufzeit versagen kann.InvalidCastException).

C# bietet zwei Betreiber, um zu vermeiden, dass diese Ausnahme ausgeworfen wird:

Ab:

Employee e = new Employee();

Zuerst:

Manager m = e as Manager; // if downcast fails m is null; no exception thrown

Zweite:

if (e is Manager){...} // the predicate is false if the downcast is not possible 

Warnung: Wenn Sie ein Upcast durchführen, können Sie nur auf die Methoden, Eigenschaften usw. der Superklasse zugreifen ...

Falls Sie jedes Mitarbeiterobjekt überprüfen müssen, ob es sich um ein Manager -Objekt handelt, verwenden Sie die Methode von Typen:

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..
}

Antwort 1: Ja, es rief Upcasting an, aber die Art und Weise, wie Sie es tun, ist nicht modern. Upcasting kann implizit durchgeführt werden, dass Sie keine Konvertierung benötigen. Also nur schreibe Mitarbeiter emp = mgr;ist genug für das Aufschlag.

Antwort 2: Wenn Sie Objekt der Managerklasse erstellen, können wir sagen, dass Manager ein Mitarbeiter ist. Da Klassenmanager: Mitarbeiter darstellt IS-A-Beziehung zwischen Mitarbeiterklasse und Managerklasse. Wir können also sagen, dass jeder Manager ein Mitarbeiter ist.

Wenn wir jedoch ein Objekt der Mitarbeiterklasse erstellen, können wir nicht sagen, dass dieser Mitarbeiter Manager ist, weil Klassenangestellter ist eine Klasse, die keine andere Klasse erbt. Sie können das Objekt der Mitarbeiterklasse zum Manager -Klassenobjekt nicht direkt niedergeschlagen.

Die Antwort ist also, wenn Sie von der Mitarbeiterklassenobjekt zum Manager -Klassenobjekt niedergeschlagen sind, müssen Sie zuerst Objekt von Manager -Klasse zuerst haben, dann können Sie es optimieren und dann downcace.

UPASTING UND DURCHBUCH:

Upcasting: Casting von der abgeleiteten Klasse bis zur Basisklasse Downcasting: Casting von der Basisklasse bis zur abgeleiteten Klasse

Lassen Sie uns dasselbe wie ein Beispiel verstehen:

Betrachten Sie zwei Klassen Form als meine übergeordnete Klasse und Kreis als abgeleitete Klasse, die wie folgt definiert ist:

class Shape
{
    public int Width { get; set; }
    public int Height { get; set; }
}

class Circle : Shape
{
    public int Radius { get; set; }
    public bool FillColor { get; set; }
}

UPRAPING:

Form s = neuer Form ();

Kreis C = S;

Beide C und S verweisen auf denselben Speicherort. Beide haben jedoch unterschiedliche Ansichten, dh verwendet "C" -Referation Sie können auf alle Eigenschaften der Basisklasse und abgeleitete Klasse zugreifen, aber mit "S" -Referenz können Sie auf Eigenschaften zugreifen, die auf Eigenschaften zugreifen können der einzigen übergeordneten Klasse.

Ein praktisches Beispiel für die Aufstockung ist die Stream -Klasse, bei der alle Arten von Stream -Leser von .NET Framework Basisklasse sind:

StreamReader reader = new streamReader (new fileStrreamReader ());

Hier ist fileStrreamReader () auf Streader Redner aufgebaut.

Niederschlag:

Form S = neuer Kreis (); Hier, wie oben erläutert, ist die Ansicht von S der einzige Elternteil, um es sowohl für Eltern als auch für ein Kind zu schaffen, das wir downcastieren müssen

var c = (Kreis) s;

Das praktische Beispiel für Downcasting ist die Schaltfläche der WPF.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top