2014-04-02 3 views
5

Ich habe den folgenden Code in JavaProtected Mitglied Unterschied in Java und C#

public class First { 
    protected int z; 

    First() 
    { 
     System.out.append("First const"); 
    } 

} 

class Second extends First { 

    private int b; 
    protected int a; 

} 

class Test { 
    /** 
    * @param args the command line arguments 
    */ 
    int a=0; 

    public static void main(String[] args) { 
     // TODO code application logic here 
     First t=new Second(); 
     t.z=10; work fine 
     First x=new First(); 
     x.z=1; // works fine 
    } 
} 

so kann ich z Zugriff durch Aufgabe base Klasse

C#

class A 
{ 
    protected int x = 123; 
} 

class B : A 
{ 
    static void Main() 
    { 
     A a = new A(); 
     B b = new B(); 

     // Error CS1540, because x can only be accessed by 
     // classes derived from A. 
     // a.x = 10; 

     // OK, because this class derives from A. 
     b.x = 10; 
    } 
} 

So Erstellen Ich kann nicht auf a zugreifen, wenn durch Basisklassenobjekt. Ich fand Java und C# ähnlich aus einer Sicht OOP, gibt es einen Unterschied zwischen beiden Sprachen für protected Mitglieder?

with reference to this doc

+1

"geschützt" in Java entspricht "geschützt intern" in C# - d. H. Zugänglich durch die definierende Klasse, abgeleitete Klasse oder eine Klasse in demselben Paket/Assembly. –

Antwort

1

Der Unterschied besteht darin, dass ein geschütztes Element in Java kann aus dem gleichen Paket zugegriffen werden. In C++ gibt es keine Entsprechung für die Sichtbarkeit auf Paketebene in Java.

+0

@tibtof wollte nur bestätigen, dass protected hat unterschiedliche Verhalten in c3 und Java –

+0

in C# funktioniert so: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and- structs/access-modifiers – Adam

+0

Detaillierte Erklärung: https://www.codeproject.com/Articles/1078878/Differences-in-Java-and-Csharp-protected – user1068352

1

Ich stimme der Antwort von tibtof zu. Die einzige Bemerkung, die ich habe, ist, dass Ihr Java-Beispiel nicht das gleiche wie das C# -Beispiel ist.

Sie können die beiden Codes ähnlich machen, indem Sie die Methode "public static void main ..." Ihrer Klasse Test in die Klasse Second einfügen, die Klasse Test löschen und Second public machen.

Das Ergebnis ist das gleiche wie Ihre Ergebnisse: Es funktioniert in Java, aber nicht in C#.