2014-04-02 4 views
5

Ho il seguente codice in Javadifferenza membro protetto in Java e 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 
    } 
} 

modo che io possa accedere z con la creazione di oggetti di base classe

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; 
    } 
} 

Così Non riesco ad accedere a a, se tramite l'oggetto della classe base. Ho trovato Java e C# simile da un OOP punto di vista, v'è alcuna differenza tra i due lingue protected membri?

with reference to this doc

+1

"protected" in Java equivale a "protected internal" in C#, ad esempio accessibile dalla classe di definizione, dalla classe derivata o da una classe nello stesso package/assembly. –

risposta

1

La differenza è che in Java un membro protetto potrebbe essere accessibile dal stesso pacchetto. In C++ non esiste un'equivalenza per la visibilità a livello di pacchetto in java.

+0

@tibtof voleva solo per confermare che ha protetto behavious diversa in c3 e java –

+0

in C# funziona così: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and- struct/accesso modificatori – Adam

+0

spiegazione dettagliata: https://www.codeproject.com/Articles/1078878/Differences-in-Java-and-Csharp-protected – user1068352

1

Sono d'accordo con la risposta di tibtof. L'unica osservazione che ho è che il tuo esempio Java non è lo stesso dell'esempio C#.

È possibile effettuare i due codici simili mettendo il metodo "public static void main ..." della classe di test in classe In secondo luogo, l'eliminazione della classe Test e fare Seconda pubblica.

il risultato è lo stesso che i risultati: funziona in Java, ma non in C#.