2016-08-09 14 views
0

ich den folgenden Code haben:C# nicht mehr geschützt Methode aufrufen aus void main

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    abstract class parent 
    { 
     public abstract void printFirstName(); 

     protected virtual void printLastName() 
     { 
      Console.WriteLine("Watson"); 
     } 

     protected void printMiddlename() 
     { 
      Console.WriteLine("Jane"); 
     } 
    } 

    class child: parent 
    { 
     public override void printFirstName() 
     { 
      Console.WriteLine("Mary"); 
     } 

     protected override void printLastName() 
     { 
      Console.WriteLine("Parker"); 
     } 

     public void getMiddleName() 
     { 
      printMiddlename(); 
     } 
    } 


    class Program: child 
    { 
     static void Main(string[] args) 
     { 
      child ch = new child(); 

      ch.printFirstName(); 
      ch.getMiddleName(); 
      //ch.printLastName(); 

      Console.Read(); 
     } 
    } 
} 

Dieser Code wird ordnungsgemäß ausgeführt und druckt Mary Jane

Allerdings, wenn ich Kommentar- ch.printLastName(); es showscompile Fehler:

enter image description here

Warum kann mein Programm Klasse Aufruf geschützte Methode von Child-Klasse? vor allem, wenn die Child-Klasse kein Problem beim Aufruf der geschützten Methode (printMiddleName) der Elternklasse hat?

+1

Diese Methode ist geschützt, ist nur für Kinder aus der Unterklasse verfügbar. Tippfehler ? –

+2

Kannst du erklären, was du _expect_ 'protected' hast, um tatsächlich für dich zu tun? Ich denke, Sie haben ein Missverständnis dessen, was es tut. –

+1

Dies ist grundlegende Dinge. Hier ist die Seite zu [Barrierefreiheitsebenen] (https://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx), die Ihnen die Definition für 'protected' mitteilt. –

Antwort

4

Ich denke, Sie sind verwirrend Erbe und Zugriffsebenen.

Ihre Program Klasse erbt die printFirstName Methode von child. So innerhalb Ihre Program Klasse können Sie diese Methode zugreifen:

class Program : child 
{ 
    void Method() { this.printFirstName(); } 
} 

Von außerhalb eine Klasse, die Sie nicht protected Methoden zugreifen können. Aber von innen eine Klasse können Sie die protected Methoden der Instanz zugreifen die gleiche Art:

class Program : child 
{ 
    void Method() 
    { 
     Program p1 = new Program(); 
     p1.printFirstName(); // this works 

     child c1 = new child(); 
     p1.printFirstName(); // this gives your compiler error 
} 

Aber man kann nicht eine protected Methode einer Instanz eines anderen Typs zugreifen, auch wenn es sich um eine tippen Sie hergeleitet von.

Siehe MSDN about access levels für weitere Details.

2

C# Spezifikation Abschnitt 1.6.2 Zugänglichkeits

Each member of a class has an associated accessibility, which controls the regions of program text that are able to access the member

public - Access not limited

protected - Access limited to this class or classes derived from this class

Geschütztes Mitglieder zugänglich sind nur in der aktuellen Klasse (wo es definiert ist) und Klassen daraus abgeleitet.

In einem anderen Wort, können Sie es nur von this zugreifen.

1

printLastName ist geschützt. Überprüfen Sie die MSDN-Seite über access modifiers:

protected

The type or member can be accessed only by code in the same class or struct, or in a class that is derived from that class.

0

In juristischer Hinsicht das Verfahren markiert mit geschütztem wird, was bedeutet, dass die Klasse selbst (Kind) kann nur die Methode oder eine andere Klasse von ihm erben zugreifen.

Programm die Methode off ‚ch‘ aufrufen können nicht darauf zugreifen, sondern eine Instanz des Programms (als Erben Kind) die Methode aufrufen können.

+0

Das ist falsch - Sie beschreiben 'private' Zugriffsmodifizierer, nicht' geschützt' – CoolBots

+0

huh? Dies ist die gleiche Erklärung, wenn auch in der Form von Laien, dass die Leute nur aus der Spezifikation und msdn Website zitieren ...? – Geek

+0

nein, die Vereinfachung der "Laien" vereinfacht ein ziemlich wichtiges Detail - dass eine abgeleitete Klasse auch Zugriff auf die Methode mit dem Zugriffsmodifizierer "protected" haben kann. Sie haben stattdessen den 'privaten' Zugriffsmodifikator beschrieben. Bitte beheben Sie Ihre Antwort, ich werde den Downvote entfernen. – CoolBots

0

Ihr Code passt Ihre Frage nicht - Sie fragen, warum nicht Program Klasse Aufruf geschützte Methode davon Elternteil ist (das heißt, child Klasse in Ihrem Beispiel) - aber Ihr Code eine Instanz von child zeigt Klasse versucht, öffentlich auf eine geschützte Methode zuzugreifen - was wie geplant fehlschlägt.

arbeiten Dies würde:

printLastName(); 

Oder:

new Program().printLastName(); 
+0

Eigentlich, wenn Sie den Code aus der Frage nehmen und ersetzen Sie die ch mit diesem wird es nicht funktionieren als eine statische Methode .... nicht nach unten abstimmen, wie das scheint Kind-ish (lol Wortspiel beabsichtigt;)) – Geek

+0

@Hyder gut Punkt, I.updated meine Antwort. – CoolBots

1

Geschützte Schlüsselwort bedeutet, dass nur eine Art und Typen, die von dieser Art ableiten das Element zugreifen können. so in diesem Szenario können Sie nicht greift Child.printLastName() aus dem Programm Weil es zwei Ebenen

Parent.printLastName haben() -> geschützt Child.printLastName() -> geschützt

Wie Vererbung Arbeit Wenn Sie Child.printLastName() von der Programmklasse aufrufen, ruft es Parent.printLastName() -> Child.printLastName() auf, aber parent ist nicht zugänglich, da es sich um die Region handelt, in der der Kompilierungsfehler angezeigt wird.

Lösung: -

Sie können
Parent.printLastName machen() -> Interne Zugriffsmodifikator

so Parent.printLastName() ist in dieser Versammlung zugänglich.

Namespace ConsoleApplication2 { abstrakte Klasse Eltern { public void printFirstName();

 internal virtual void printLastName() 
     { 
      Console.WriteLine("Watson"); 
     } 

     public void printMiddlename() 
     { 
      Console.WriteLine("Jane"); 
     } 
    } 

    class child : parent 
    { 
     public override void printFirstName() 
     { 
      Console.WriteLine("Mary"); 
     } 

     protected override void printLastName() 
     { 
      Console.WriteLine("Parker"); 
     } 

     public void getMiddleName() 
     { 
      printMiddlename(); 
     } 
    } 


    class Program : child 
    { 
     static void Main(string[] args) 
     { 
      child ch = new child(); 

      ch.printFirstName(); 
      ch.getMiddleName(); 
      ch.printLastName(); 

      Console.Read(); 
     } 

    } 
}