none
se puede cambiar el acceso a un atributo heredado

    Pregunta

  • hola a todos mi duda es algo simple

    si tengo una clase con tres atributos

    PrimeraClase()

    public int id {get; set}

    public string nombre {get; set;}

    public string apellido {get; set;}

    segundaClase : primeraClase

    podria yo cambiar el atributo apellido a privado, o a alguna otra para que no se pueda ver cuando se cree este objeto

    lunes, 12 de noviembre de 2012 21:06

Respuestas

  • No puede.  Eso iría contra las reglas de herencia.  Específicamente rompería la relación ES-UN:  La clase segundaClase dejaría de ser-un primeraClase.  En otras palabras, segundaClase no puede considerarse que sea PrimeraClase.

    Lo más que puede hacer es esconder la propiedad heredada usando la palabra clave new.  Pero nótese que un cast a PrimeraClase logrará acceder la propiedad escondida:

    public class PrimeraClase
    {
        public int ID { get; set; }
        public string Nombre { get; set; }
        public string Apellido { get; set; }
    }
    public class SegundaClase : PrimeraClase
    {
        //Esconda uno de los miembros:
        private new string Nombre { get; set; }
    }
    
    //Ahora su uso:
    SegundaClase sc = new SegundaClase();
    sc.Nombre; //No es posible pues es privado.
    PrimeraClase pc = sc as PrimeraClase;
    pc.Nombre; //Sí es posible pues PrimeraClase.Nombre sí es público.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta niqel lunes, 12 de noviembre de 2012 21:44
    lunes, 12 de noviembre de 2012 21:37
    Moderador

Todas las respuestas

  • No puede.  Eso iría contra las reglas de herencia.  Específicamente rompería la relación ES-UN:  La clase segundaClase dejaría de ser-un primeraClase.  En otras palabras, segundaClase no puede considerarse que sea PrimeraClase.

    Lo más que puede hacer es esconder la propiedad heredada usando la palabra clave new.  Pero nótese que un cast a PrimeraClase logrará acceder la propiedad escondida:

    public class PrimeraClase
    {
        public int ID { get; set; }
        public string Nombre { get; set; }
        public string Apellido { get; set; }
    }
    public class SegundaClase : PrimeraClase
    {
        //Esconda uno de los miembros:
        private new string Nombre { get; set; }
    }
    
    //Ahora su uso:
    SegundaClase sc = new SegundaClase();
    sc.Nombre; //No es posible pues es privado.
    PrimeraClase pc = sc as PrimeraClase;
    pc.Nombre; //Sí es posible pues PrimeraClase.Nombre sí es público.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta niqel lunes, 12 de noviembre de 2012 21:44
    lunes, 12 de noviembre de 2012 21:37
    Moderador
  • a pero no importa con un cast, la quiero esconder para mi mismo jajajaja

    por que luego me confundo, osea para que no me deje cometer errores,

    muchas gracias era todo lo que necesitaba

    lunes, 12 de noviembre de 2012 21:44
  • es mas si extiendes el ejemplo de Jose
       public class PrimeraClase
        {
            public int ID { get; set; }
            public string Nombre { get; set; }
            public string Apellido { get; set; }
        }
        public class SegundaClase : PrimeraClase
        {
            //Esconda uno de los miembros:
            private new string Nombre { get; set; }
        }
    
        public class TercerClase : SegundaClase
        {
        }

    al usar

     TercerClase tercer= new TercerClase();

    string nombre = tercer.Nombre;

    te muestra la propiedad Nombre, porque no se puede ocultar una herencia


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    lunes, 12 de noviembre de 2012 21:48
  • a okey

    si lo entiendo, pero sirve para ayudarnos a programar no viendo en ese momento atributos inecesarios

    una duda mas

    Ese aplica tambien en una composicion

    si la primera clase, fuera un atributo de la segunda, y yo deseara que cuando cree el objeto de la segunda clase no me apareciera el atributo nombre de la primera clase, es posible

    lunes, 12 de noviembre de 2012 21:52
  • No, no sería posible.  Nombre aparecería.

    Jose R. MCP
    Code Samples

    lunes, 12 de noviembre de 2012 21:57
    Moderador
  • si la primera clase, fuera un atributo de la segunda, y yo deseara que cuando cree el objeto de la segunda clase no me apareciera el atributo nombre de la primera clase, es posible

    apuntas a esto

    public class PrimeraClase { public int ID { get; set; } public string Nombre { get; set; } public string Apellido { get; set; } } public class SegundaClase {

    public SegundaClase(){

    this.primeraclae= new PrimeraClase();

    } public PrimeraClase primerclase{ get; set; } }

    en ese caso tampoco puede ocultarlo porque se puede hacer

    SegundaClase segunda = newSegundaClase();

    string nombre = segunda.primeraclase.Nombre;

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 12 de noviembre de 2012 22:04
  • que dificil tendre que crear otra clase,

    esa as de cuenta que es primera clase

    public class EntityServerResult
        {
            //Atributos privados
            private SqlDataReader sqlDataReader;
            private EntityServerConectionReport serverReport;
            private List<EntityServerCommandReport> listCommandReports;
            private int recordsTotal;
            private int recordsAffected;
            private int recordsFailed;
    
            //Atributos publicos de solo lectura
            public SqlDataReader MySqlDataReader
            { get { return this.sqlDataReader; } }
            public EntityServerConectionReport ServerReport
            { get { return this.serverReport; } }
            public List<EntityServerCommandReport> ListCommandReports
            { get { return this.listCommandReports; } }
            public int RecordsTotal
            { get { return this.recordsTotal; } }
            public int RecordsAffected
            { get { return this.recordsAffected; } }
            public int RecordsFailed
            { get { return this.recordsFailed; } }
    
            public EntityServerResult(EntityServerConectionReport serverReport, List<EntityServerCommandReport> listCommandReports)
            {
                this.serverReport = serverReport;
                this.listCommandReports = listCommandReports;
                this.recordsTotal = listCommandReports.Count;
                foreach (EntityServerCommandReport item in this.listCommandReports)
                {
                    if (item.Status == true)
                    {
                        this.recordsAffected += 1;
                    }
                    else
                    {
                        this.recordsFailed += 1;
                    }
                }
            }
    
          
            public EntityServerResult(EntityServerConectionReport serverReport, List<EntityServerCommandReport> listCommandReports, SqlDataReader sqlDataReader)
            {
                this.sqlDataReader = sqlDataReader;
                this.serverReport = serverReport;
                this.listCommandReports = listCommandReports;
                this.recordsTotal = 0;
                this.recordsAffected = 0;
                this.recordsFailed = 0;
            }
    
            public EntityServerResult(EntityServerConectionReport serverReport)
            {
                this.serverReport = serverReport;
                this.listCommandReports = null;
                this.recordsTotal = 0;
                this.recordsAffected = 0;
                this.recordsFailed = 0;
            }
        }

    y esta es segunda clase

    public class EntityRepositoryResult<T> where T: class
        {
            //Atributos privados
            public List<T> EntityList { get; set; }
            public Entities.Repository.EntityServerResultRepositoy ServerResult { get; set; }
    
            public EntityRepositoryResult()
            {
                EntityList = new List<T>();
                ServerResult = new EntityServerResultRepositoy();
            }
        }

    aunque ya me dijeron que no se puede les pongo el codigo para que quede mas visto lo que queria,

    me encantaria que creando EntityRepositorioResult cunado haga esto

    entityRepositorioResult.SqlDatareader no apareciera, estuviera oculto

    lunes, 12 de noviembre de 2012 22:26