Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema con herencia en C#

Estas en el tema de Problema con herencia en C# en el foro de .NET en Foros del Web. Hola, tengo un problema. Llevo varios días atascado en un código de C#, y muy pronto tengo que entregar un trabajo. El problema ocurre en ...
  #1 (permalink)  
Antiguo 11/05/2009, 05:36
 
Fecha de Ingreso: marzo-2007
Mensajes: 129
Antigüedad: 17 años, 1 mes
Puntos: 0
Problema con herencia en C#

Hola, tengo un problema.

Llevo varios días atascado en un código de C#, y muy pronto tengo que entregar un trabajo.

El problema ocurre en el siguiente fragmento de código:

Código:
Persona p = MiAgenda[pos];
                ContactoEmpresarial p2 = p as ContactoEmpresarial;
                p2.Asigna_datos(textBoxEmpresa.Text, textBoxCargo.Text, textBoxTelf2.Text);                
                p2.ModificarPersona(textBoxNombre.Text, textBoxApellidos.Text, textBoxTelf.Text, f_nacimiento);
Persona p contiene la información que obtengo de MiAgenda[pos], y lo que pretendo es actualizar esa información con ModificarPersona, pero a su vez, también modificar otros valores heredados de ContactoEmpresarial.

Cuando se ejecuta esas lineas de código, me salta "Referencia a objeto no establecida como instancia de un objeto." en la linea de p2.Asigna_datos.

No se si me estoy explicando correctamente, pues con esto de la herencia tengo un lío en la cabeza increíble.

Espero que alguien pueda echarme un cable con esto, porque me está desesperando.

Un saludo y gracias de antemano.
  #2 (permalink)  
Antiguo 11/05/2009, 06:01
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Problema con herencia en C#

pon el codigo de tus dos clases

Persona y ContactoEmpresarial

por ahi creo que te faltara un constructor copia, pero hasta no ver tu codigo imposible saberlo
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #3 (permalink)  
Antiguo 11/05/2009, 06:12
 
Fecha de Ingreso: marzo-2007
Mensajes: 129
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Problema con herencia en C#

Muchas gracias, te he enviado un MP con el código, a ver si puedes echarle un vistazo por favor.

Lo del constructor copia no lo entiendo del todo :S

Gracias de nuevo.
  #4 (permalink)  
Antiguo 11/05/2009, 06:37
 
Fecha de Ingreso: marzo-2007
Mensajes: 129
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Problema con herencia en C#

Persona.cs
Código:
using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsApplication1
{
    class Persona
    {

        static Random rand = new Random();
        private DateTime fnac;
        private string nombre, apellidos, telf;

        /// <summary>
        /// creamos la persona
        /// </summary>
        public Persona(string nombre, string apellidos, string telf, DateTime fnac)
        {
            int dia, mes, año;

            this.nombre = nombre;
            this.apellidos = apellidos;
            this.telf = telf;
            this.fnac = fnac;

            Fecha_aleatoria(1950, 2000, out dia, out mes, out año);

            this.fnac = new DateTime(año, mes, dia);

        }
        /// <summary>
        /// constructor, crea una persona con los campos vacíos
        /// </summary>
        public Persona()
        {
            nombre = "";
            apellidos = "";
            telf = "";
            fnac = DateTime.MinValue;
        }
        /// <summary>
        /// Asignamos los datos
        /// </summary>
        public void ModificarPersona(string nombre, string apellidos, string telf, DateTime fnac)
        {
            this.nombre = nombre;
            this.apellidos = apellidos;
            this.telf = telf;
            this.fnac = fnac;
        }

        /// <summary>
        /// Devuelve el nombre de la persona 
        /// </summary>
        /// <returns></returns>
        public string Nombre()
        {
            return nombre;
        }

        /// <summary>
        /// Devuelve los apellidos de la persona 
        /// </summary>
        /// <returns></returns>
        public string Apellidos()
        {
            return apellidos;
        }

        /// <summary>
        /// Devuelve el teléfono de la persona 
        /// </summary>
        /// <returns></returns>
        public string Telf()
        {
            return telf;
        }

        /// <summary>
        /// Devuelve la fecha de nacimiento de la persona 
        /// </summary>
        /// <returns></returns>
        public DateTime Fecha_Nacimiento()
        {
            return fnac;
        }

        // muestra los datos de la persona de forma lineal
        public string Resumido()
        {
            return nombre + "    " + apellidos + "    " + telf;
        }






        // ---------------- fecha aleatoria -------------------------------------------------------------




        /// <summary>
        /// genera una fecha aleatoria entre los años introducidos
        /// </summary>
        /// <param name="anyoMin">año menor para generar fecha</param>
        /// <param name="anyoMax">año mayor para generar fecha</param>
        /// <param name="dia">día generado aleatoriamente</param>
        /// <param name="mes">mes generado aleatoriamente</param>
        /// <param name="anyo">año generado aleatoriamente dentro del rango (anyoMin-anyoMax)</param>
        public static void Fecha_aleatoria(int anyoMin, int anyoMax, out int dia, out int mes, out int anyo)
        {
            if (anyoMin > anyoMax)
            {   // Error en los parámetros
                dia = mes = anyo = 0;
                return;
            }

            // generamos un año aleatoriamente comprendido entre el año menor y el mayor
            anyo = rand.Next(anyoMin, anyoMax);
            // generamos un cualquier mes comprendido entre 1 y 12
            mes = rand.Next(1, 12);

            // dependiendo del año y del mes podemos generar un dia u otro e incluso puede ser un día erroneo ya que ni 
            // todos los meses ni todos los años tienen los mismos días.
            // Vamos generando fechas hasta que sea correcta
            for (; ; )
            {
                dia = rand.Next(1, 31); // lo máximo que puede tener un mes es 31 y lo mínimo 1

                // comprobamos que la fecha sea correcta. Sino generamos otra hasta que sea correcta
                if (EsFechaOk(dia, mes, anyo))
                {
                    // si la fecha es correcta salimos y nos quedamos con esos valores para mostrarlo en pantalla
                    return;
                }

            }


        }

        /// <summary>
        /// comprueba si la fecha introducida por el usuario existe
        /// </summary>
        /// <param name="dia">dia a analizar</param>
        /// <param name="mes">mes a analizar</param>
        /// <param name="anyo">año a analizar</param>
        /// <returns></returns>devuelve verdadero si la fecha existe y falso si no existe (fecha errónea)
        public static bool EsFechaOk(int dia, int mes, int anyo)
        {
            if (mes < 1 || mes > 12)
            {
                return false;
            }

            if (dia < 0 || dia > Ndias_Mes(mes, anyo))
            {
                return false;
            }
            return true;

        }

        /// <summary>
        /// devuelve el número de días que tiene un mes
        /// </summary>
        /// <param name="mes">mes que vamos a analizar</param>
        /// <param name="anyo">año que vamos a analizar</param>
        /// <returns></returns>devueve un número entero (nº de día del mes)
        public static int Ndias_Mes(int mes, int anyo)
        {
            int num_dias = 0; //dias que tiene un mes.


            if (mes == 2)
            {

                if (Es_biciesto(anyo))  //el año es bisiesto
                {
                    num_dias = 29;

                }

                else  // el año no es biciesto 
                {

                    num_dias = 28;
                }

            }

            else
            {
                // meses de 31 dias

                if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)
                {

                    num_dias = 31;
                }
                else  // meses de 30
                {

                    num_dias = 30;
                }

            }

            return num_dias;



        }





        /// <summary>
        /// función que nos dice si un año es biciesto o no
        /// </summary>
        /// <param name="anyo">año que vamos a analizar</param>
        /// <returns></returns>devuelve verdadero si es biciesto y falso si no lo es
        public static bool Es_biciesto(int anyo)
        {
            if (anyo % 4 == 0 && (!((anyo % 100 != 0) && (anyo % 400 == 0))))  //el año es bisiesto
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}
ContactoEmpresarial.cs
Código:
using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsApplication1
{
    class ContactoEmpresarial : Persona
    {
        string empresa;
        string cargo;
        string telfempresa;

        public ContactoEmpresarial()
        {
            empresa = "";
            cargo = "";
            telfempresa = "";
        }

        public ContactoEmpresarial(string empresa, string cargo, string telfempresa, string nombre, string apellidos, string telf, DateTime fnac)
            : base(nombre, apellidos, telf, fnac)
        {
            this.empresa = empresa;
            this.cargo = cargo;
            this.telfempresa = telfempresa;
        }

        public void Asigna_datos(string empresa, string cargo, string telfempresa)
        {
            this.empresa = empresa;
            this.cargo = cargo;
            this.telfempresa = telfempresa;
        }


        /*public override string Nombre()
        {
            return nombre;
        }

        public override string Apellidos()
        {
            return apellidos;
        }

        public override string Telf()
        {
            return telf;
        }

        public override DateTime Fecha_Nacimiento()
        {
            return fnac;
        }*/

        public string leerempresa()
        {
            return empresa;
        }
        public string leercargo()
        {
            return cargo;
        }
        public string leertelfempresa()
        {
            return telfempresa;
        }
    }
}
  #5 (permalink)  
Antiguo 12/05/2009, 05:30
 
Fecha de Ingreso: marzo-2007
Mensajes: 129
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Problema con herencia en C#

Hola, ya solucionamos ese problema, pero ahora tenemos otro que publicaremos en otro hilo, porque, es de otra cosa diferente.

Un saludo y gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:21.