2011-03-16 21 views
6

El constructor de la clase secundaria "cesar" da un error. Dice que el nombre, el tipo es inaccesible debido a su nivel de protección. ¿Cómo? Como esta es una clase hija derivada de la clase "Cipher", no debería dar un error como este. ¿Cómo puedo superar esta situación? Pero quiero que esas variables sean privadas. No quiero cambiarlos como públicos.C# "es inaccesible debido a su nivel de protección" error en el constructor

*** El segundo ejemplo de código funciona. ¿Alguien puede ver la diferencia?

namespace Encrypter 
{ 
    class Cipher 
    { 
     public Cipher(string name, string type) 
     { 
      setName(name); 
      setType(type); 

     } 
     private string name; 
     private string type; 

     public void setName(string newName) 
     { 
      name = newName; 
     } 
     public string getName() 
     { 
      return name; 
     } 
     public void setType(string newType) 
     { 
      type = newType; 
     } 
     public string getType() 
     { 
      return type; 
     } 
     public string encrypt(string text) 
     { 
      return text; 
     } 
     public string decrypt(string text) 
     { 
      return text; 
     } 
    } 
} 




namespace Encrypter 
{ 
    class Caesar : Cipher 
    { 

     private int shiftamount; 
     private string shiftdirection; 
     public Caesar(int shiftamount, string shiftdirection) : base(name, type) 
     { 
      setShiftamount(shiftamount); 
      setShiftdirection(shiftdirection); 
     } 
     public void setShiftamount(int newShiftamount) 
     { 
      shiftamount = newShiftamount; 
     } 
     public int getShiftamount() 
     { 
      return shiftamount; 
     } 
     public void setShiftdirection(string newShiftdirection) 
     { 
      shiftdirection = newShiftdirection; 
     } 
     public string getShiftdirection() 
     { 
      return shiftdirection; 
     } 

    } 
} 

----------------------------- Nueva edición ------------ ----

class MyFile 
    { 
     public MyFile(int id, string name, int size, string type) 
     { 
      setId(id); 
      setName(name); 
      setSize(size); 
      setType(type); 

     } 
     private int id; 
     private string name; 
     private string type; 
     private int size; 




class Movie : MyFile 
    { 
     private string director; 
     private int release_year; 
     public Movie(string director, int release_year, int id, string name, int size) : base(id, name, size, "m") 
     { 
      setDirector(director); 
      setRelease_year(release_year); 
     } 
+16

Gah! Está utilizando C# ... use Propiedades en lugar de métodos getter/setter. –

+0

Las [directrices de nombres] (http://msdn.microsoft.com/en-us/library/xzf533w0%28v=vs.71%29.aspx) también podría ser una buena lectura para el afiche. El código se ve muy similar a Java. ;-) – mpontillo

+0

Sí, en realidad mi idioma preferido es Java, así que estoy muy acostumbrado. Como C# es similar a Java, utilizo mis hábitos de programación de Java también en C#: D, pero sí, estás en lo cierto :) – Alptugay

Respuesta

7

Parece que cometió un error al definir el constructor de clase derivado. Si desea obtener los valores name y type en la superclase, tendrá que pasarlos como argumentos de constructor adicionales (para un total de 4 argumentos en el constructor de clase derivado). Por ejemplo, cambiarlo a esto debería funcionar:

public Caesar(int shiftamount, 
        string shiftdirection, 
        string name, 
        string type) 
        : base(name, type) 

Existen otras estrategias que puede tomar.

+0

Oh, tienes razón. Acabo de hacer una edición en mi publicación. Y es justo como dijiste. Gracias – Alptugay

3

No se puede acceder a los miembros privados desde las clases derivadas. protegido y público puede. Debes hacerlos protegidos. De esta forma, solo la clase y sus "hijos" tendrán acceso.

Resumen de los derechos de acceso:

  • private: se puede acceder sólo a ella, los métodos de clase, nada más
  • protected: se puede acceder desde esa clase de y los métodos de sus niños
  • internal: sólo se puede acceder desde métodos dentro del mismo conjunto
  • protected internal: mismos como métodos + internos de clases derivadas de otros conjuntos
  • public: se puede acceder por todos
3

private significa que sólo se la clase declarando puede acceder a los miembros (lo que significa que los tipos heredados no puede, tampoco).

protected significa que la clase declarante y cualquier descendiente pueden acceder a los miembros, pero los tipos que no pertenecen a ellos no pueden acceder.

En una nota diferente, las funciones get y setter generalmente no se utilizan en los lenguajes .NET. Las propiedades encapsulan esta funcionalidad y son lo que se debe usar en su lugar. Por ejemplo;

private string name; 

public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 
5
public Caesar(int shiftamount, string shiftdirection) 
     : base(name, type) 
    { 

El problema es el nombre private campos y el tipo - la clase de niño no puede acceder a ellos a menos que estén marcados como protected. Lo que realmente quieres sospecho es

public Caesar(int shiftamount, string shiftdirection) 
     : base("Caesar5", "Caesar") 
    { 
Cuestiones relacionadas