70 - Atributos y propiedades estáticas


Los atributos estáticos tienen un comportamiento muy distinto a los atributos vistos hasta el momento. Un atributo estático se reserva espacio para el mismo indistintamente que definamos un objeto de dicha clase. En caso de crear varios objetos de dicha clase todas las instancias acceden al mismo atributo estático. Recordemos que los atributos que habíamos visto son independientes en cada objeto de la clase.

Problema 1:

Definir un atributo estático que almacene la cantidad de objetos creados de dicha clase.

Programa:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AtributosEstaticos1
{
    class Persona
    {
        private string nombre;
        private int edad;
        public static int cantidad;

        public Persona(string nom,int ed)
        {
            cantidad++;
            nombre = nom;
            edad = ed;
        }

        public void Imprimir()
        {
            Console.WriteLine(nombre + "-" + edad);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.cantidad);
            Persona per1 = new Persona("juan", 30);
            per1.Imprimir();
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.cantidad);
            Persona per2 = new Persona("ana", 20);
            per2.Imprimir();
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.cantidad);
            Persona per3 = new Persona("luis", 10);
            per3.Imprimir();
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.cantidad);
            Console.ReadKey();
        }
    }
}

Un atributo estático de tipo entero se inicializa en cero cuando lo definimos (lo definimos de tipo public para poder acceder a su valor desde afuera de la clase):


        public static int cantidad;

En el constructor de la clase incrementamos el atributo estático en uno:

        public Persona(string nom,int ed)
        {
            cantidad++;
            nombre = nom;
            edad = ed;
        }

Desde fuera de la clase podemos acceder a dicho atributo mediante el nombre de la clase sin tener que definir un objeto de la misma:

            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.cantidad);

Luego de crear un objeto de la clase Persona se ejecuta el constructor de la clase donde se incrementa en uno el atributo estático cantidad:

            Persona per1 = new Persona("juan", 30);

Si mostramos nuevamente el atributo cantidad veremos que su contenido es uno:

            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.cantidad);

No importa cuantos objeto de la clase Persona se creen luego existe un solo atributo cantidad:


            Persona per2 = new Persona("ana", 20);
            per2.Imprimir();
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.cantidad);
            Persona per3 = new Persona("luis", 10);
            per3.Imprimir();
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.cantidad);

Si queremos encapsular el atributo cantidad en la clase Persona luego podemos definir una propiedad estática.

Problema 2:

Definir una propiedad estática para acceder a un atributo estático que guarda la cantidad de objetos creados de dicha clase.

Programa:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PropiedadesEstaticas1
{
    class Persona
    {
        private string nombre;
        private int edad;
        private static int cantidad;

        public static int Cantidad
        {
            set
            {
                cantidad = value;
            }
            get
            {
                return cantidad;
            }
        }

        public Persona(string nom, int ed)
        {
            cantidad++;
            nombre = nom;
            edad = ed;
        }

        public void Imprimir()
        {
            Console.WriteLine(nombre + "-" + edad);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.Cantidad);
            Persona per1 = new Persona("juan", 30);
            per1.Imprimir();
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.Cantidad);
            Persona per2 = new Persona("ana", 20);
            per2.Imprimir();
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.Cantidad);
            Persona per3 = new Persona("luis", 10);
            per3.Imprimir();
            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.Cantidad);
            Console.ReadKey();
        }
    }
}

Como vemos ahora definimos el atributo estático de tipo privado:

        private static int cantidad;

Esto hace necesario implementar una propiedad estática para acceder a su contenido:


        public static int Cantidad
        {
            set
            {
                cantidad = value;
            }
            get
            {
                return cantidad;
            }
        }

Luego para acceder a su valor desde fuera debemos preguntar el valor de la propiedad Cantidad ya que el atributo cantidad es privado:

            Console.WriteLine("Valor del atributo estático cantidad:" + Persona.Cantidad);

Si queremos pulir un poco más este problema podemos eliminar la parte del set de la propiedad Cantidad:

        public static int Cantidad
        {
            get
            {
                return cantidad;
            }
        }

Esto hace que no podamos por error asignar a la propiedad Cantidad un valor (genera un error en tiempo de compilación, ya que se trata de una propiedad de solo lectura):

Persona.Cantidad = 71;

El incremento del atributo cantidad solo se hace en el constructor de la clase Persona cada vez que creamos un objeto.


Retornar