Frage

    

Diese Frage bereits eine Antwort hier:

         

Es scheint eher newbie Frage kann, aber können Sie erklären, warum Methode Der.B () kann nicht Foo über Basisklassenvariable geschützten Zugriff? Das sieht komisch zu mir:

public class Base
{
    protected int Foo;
}

public class Der : Base
{
    private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member

    private void D(Der d) { Foo = d.Foo; } // OK
}

Danke!

War es hilfreich?

Lösung

Dies ist eine häufig gestellte Frage. Um herauszufinden, warum dies illegal ist, darüber nachzudenken, was schief gehen könnte.

Angenommen, Sie hatten eine andere abgeleitete Klasse Frob von Base abgeleitet. Jetzt haben Sie eine Instanz von Frob zu Der.B. passieren Sollten Sie in der Lage sein Frob.Foo zuzugreifen Der.B? Nein auf keinen Fall. Frob.Foo geschützt ist; es sollte nur von Frob und Subklassen von Frob zugänglich sein. Der ist nicht frob und ist keine Unterklasse von Frob, so geht es nicht Zugang zu Frob geschützter Mitglieder.

Wenn das nicht klar ist, finden Sie in meinem Artikel über das Thema:

http://blogs.msdn.com/ericlippert/ Archiv / 2005/11/09 / 491031.aspx

Andere Tipps

In B Sie versuchen, ein geschütztes Mitglied einer anderen Klasse zuzugreifen. Die Tatsache, dass Sie von dieser Klasse erben, ist irrelevant. In D zugreifen Sie ein geschütztes Mitglied der Basisklasse der aktuellen Klasse. In diesem Zusammenhang kann man alles von Der und die geschützten Mitglieder des Typs Zugriff aus erbt.

Sie können diese Einschränkung umgehen, indem Sie eine statische Methode in der Basisklasse deklarieren:

public class Base
{
    protected int Foo;

    protected static int GetFoo(Base b)
    {
        return b.Foo;
    }
}

public class Der : Base
{
    private void B(Base b) { Foo = GetFoo(b); } // OK
}

Einfach gesagt, geschützt ermöglicht den Zugriff auf Unterklassen.

private void B(Base b) { Foo = b.Foo; }

Sie versuchen, ein geschütztes Mitglied Instanz von Dem Zugriff auf keinen Zugang zu. Es wäre nur Zugang zu ihm haben, wenn sie die Basisklasse der aktuellen Instanz von Der (dieser) war.

private void D(Der d) { Foo = d.Foo; } // OK

Adaequat, weil Sie durch Das gehen, es ist Basisklassen geschützte Methode zuzugreifen.

In dem Szenario, Sie versuchen Sie „intern“ für int Foo verwenden möchten.

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