2017-01-24 5 views
0

Ich habe 2 Klassen zuzugreifen:Wie geschütztes Mitglied in einer geerbten Klasse

public class Access 
{ 
    public class Job 
    { 
     public int Id { get; set; } 
     protected string JobName { get; set; } 
    } 
} 

Class2.cs

public class Full: Access.Job 
{ 

} 

Full ful = new Full(); 

Warum ich nicht in der Lage bin das ful.JobName Mitglied zugreifen?

+6

Sie können Jobnamen in Ihrer Full-Klasse zugreifen, aber nicht durch eine vollständige Referenz wie ful –

+0

Sie diese Eigenschaft nur in der Full-Klasse zugreifen kann, nicht außerhalb der Klasse. Wenn Sie "protected string Job {get {return this.JobName;}}" in der Full-Klasse hinzufügen, können Sie diese auch außerhalb der Full-Klasse verwenden. – Julo

+0

Nein, ich bin nicht in der Lage, auf den Job zuzugreifen, aber ich kann auf –

Antwort

5

Weil Sie versuchen, von außerhalb der Klasse auf geschützte Methode zuzugreifen. Nur öffentliche Methoden sind verfügbar. Sie können die Eigenschaft/variabel/Methode zuzugreifen, die geschützt ist, nur in der vererbten Klasse, aber nicht von äußeren Code:

public class Full: Access.Job 
{ 
    public void mVoid() 
    { 
     Console.WriteLine(this.JobName); 
    } 

    protected void mProtVoid() 
    { 
     Console.WriteLine(this.JobName); 
    } 

    private void mPrivateVoid() 
    { 
     Console.WriteLine("Hey"); 
    } 
} 

Full myFull = new Full(); 
myFull.mVoid(); //will work 
myFull.mProtVoid(); //Will not work 
myFull.mPrivateVoid(); //Will not work 

Wenn Sie müssen die geschützte Eigenschaft zu erhalten, gibt es zwei Möglichkeiten (3 tatsächlich, aber Reflexion ist die schmutzige Art und Weise und sollte vermieden werden):

1. Machen Sie es öffentlich

Wenn es wird öffentlich festgelegt werden, wird es erben werden stil und Sie können direkt darauf zugreifen:

Full nFull = new Full(); 
Console.Write(nFull.JobName); 

2. Stellen Sie ein „Wrapper“/„Fassade“

Erstellen Sie neue Eigenschaft oder eine Methode, die die verborgene Eigenschaft zugreifen einfach und schicken Sie es in erwarteten Format.

public class Full: Access.Job 
{ 
    public string WrappedJobName { get { return this.JobName; } } 
    public string WrappedJobName => this.JobName; //C# 6.0 syntax 
} 

Full mFull = new Full(); 
Console.WriteLine(mFull.WrappedJobName); 
+0

seine Feine aber geschützte ist nur Arbeit, die von dieser Klasse erben. Hier, wenn ich FullFull erstellen = new Full(); myFull.JobName ---> Warum funktioniert es nicht –

+2

@MdDastagerJob Tatranskymedved bereits beantwortet, warum es nicht funktioniert, lesen Sie ein wenig –

+0

Weil Sie neue Instanz erstellen -> Sie sitzen neben dem Objekt und Sie dürfen auf seine Öffentlichkeit zugreifen Methoden und Eigenschaften. Wenn Sie versuchen, auf geschützte/private Methoden zuzugreifen, wird Ihnen dies nicht gestattet. Weil sie geschützt/privat sind. Definition der Sprache. http://stackoverflow.com/questions/614818/what-is-the-difference-between-public-private-protected-and-nothing – Tatranskymedved

Verwandte Themen