Mehr zu Virtual / new… plus Schnittstellen!

Gestern habe ich eine Frage zu den neuen / virtuellen / außer Kraft gesetzten Keywords gestellt und aus Ihren Antworten viel gelernt. Trotzdem habe ich noch einige Zweifel.

Zwischen all den "Boxen" verlor ich den Kontakt zu den Methodentabellen des Typs. Zum Beispiel:

interface I1 { void Draw(); }
interface I2 { void Draw(); }

class A : I1, I2
{
    public void Minstance() { Console.WriteLine("A::MInstance"); }
    public virtual void Draw() { Console.WriteLine("A::Draw"); }
    void I2.Draw() { Console.WriteLine("A::I2.Draw"); }
}
class B : A, I1, I2
{
    public new virtual void Draw() { Console.WriteLine("B::Draw"); }
    void I1.Draw() { Console.WriteLine("B::I1.Draw"); }
}

class Test
{

    public static void Main()
    {
        A a = new B();
        a.Draw();
        I1 i1 = new A();
        i1.Draw();
        I2 i2 = new B();
        i2.Draw();
        B b = (B)a;
        b.Draw();
    }

}
}

Die in dieser Übung gestellte Frage lautet: Füllen Sie die Methodentabellen der Typen gemäß dem Code aus und erläutern Sie die Ausgabe, die durch Ausführen von Main () generiert wird.

Meine Antwort war: In Typ A haben wir 3 Methoden: MInstance (), Draw () - die A :: Draw-Version - und I2 :: Draw. In Typ B haben wir 4 Methoden: MInstance from A, B :: Draw, I1 :: Draw und I2 :: Draw

Ich bin nicht sehr zuversichtlich, was meine Antwort angeht, und deshalb poste ich diese Frage. Wenn wir Interfaces implementieren, wird ein neuer Slot in der Methodentabelle für die Methoden des Interfaces erstellt. sollten wir I2 :: Draw nicht auch in Klasse A implementieren?

Wenn wir eine Methode aufrufen, die eine Schnittstellenvariable verwendet (wie i1.Draw ()), haben wir den Status "Dynamic Dispatch". Daher sollten wir uns den Typ des Objekts ansehen, das in der Variablen enthalten ist (in diesem Fall Typ A) ) und durchsuchen Sie die Methodentabelle von A nach einer Methode, die speziell I1.Draw heißt. Aber was ist, wenn wir es nicht finden? Wie soll ich in diesen Fällen vorgehen? Gibt es eine Faustregel, die ich kennen sollte, um diese Probleme erfolgreich anzugehen?

Es tut mir leid, dass ich mit dieser Frage so langweilig bin, aber ich muss diesen Knoten wirklich auf meinem Kopf lösen;)

Prost!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage