using System;
using System.Collections.ObjectModel;

namespace Modelo
{
    public abstract class RepositorioBase<T, J>
        where J : new()
    {

        protected List<T> almacen;

        //es protected para que solo se pueda llamar desde 
        //las clases que implementen a esta clase
        protected RepositorioBase() {
            almacen = new List<T>();
        }

        // Singleton thread-safe por si quiero usar "Parallel"
        private static J instance = new J();
        public static J Instance
        {
            get
            {                
                return instance;
            }   
        }

        // Lista el contenido del repositorio
        public ReadOnlyCollection<T> Listar(){
            return almacen.AsReadOnly();
        }

        // Añade objetos al almacen
        abstract public bool Add(T t);

        // Modifica objetos del almacen
        abstract public bool Mod(T t);

        // Elimina objetos del almacen
        abstract public bool Del(T t);

    }
}