none
Problemas com classe abstrata RRS feed

  • Pergunta

  • Sei que é básico da OO, mas às vezes nos confundimos. Antes eu tinha isso:

    Domain.Entity.Tarefa _Tarefa = new Domain.Entity.Tarefa();

    Acontece que a classe Tarefa virou abstrata. Como eu faço agora?

    segunda-feira, 27 de agosto de 2012 13:21

Todas as Respostas

  • Em realidade eu tenho isso aqui. Não posso instaciar uma classe abstrata, então o que eufaço no lugar de...?

    public static Domain.Entity.Tarefa RetornarPorID(Domain.Finder.Tarefa _PesquisarTarefa)
            {
                SqlConnection _SqlConnection = new SqlConnection();
                SqlDataReader _SqlDataReader = null;

                try
                {
                    _SqlConnection = DataMapperHelper.AbreConexao();

                    List<SqlParameter> _ListSqlParameters = new List<SqlParameter>();
                    _ListSqlParameters.Add(new SqlParameter("IdTarefa", _PesquisarTarefa.IdTarefa));

                    _SqlDataReader = DAO.DAOBase.RetornarPorID(_SqlConnection, "JP_SEL_TarefaPorFiltro", _ListSqlParameters);

                    Domain.Entity.Tarefa _Tarefa = new Domain.Entity.Tarefa();

                    while (_SqlDataReader.Read())
                    {
                        Inicializar(_Tarefa, _SqlDataReader);
                    }

                    return _Tarefa;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (_SqlDataReader != null)
                    {
                        _SqlDataReader.Close();
                        _SqlDataReader.Dispose();
                    }

                    DataMapperHelper.FecharConexao(_SqlConnection);
                }
            }

    segunda-feira, 27 de agosto de 2012 13:41
  • o propósito de usar uma classe abstrata é simplesmente utilizar os filhos dela como instancias então se tu tens uma classe abstrata Tarefa e quer uma instancia dela, só poderá instanciar um filho dela deste modo:

    public abstract class Tarefa
    {
    
    public int Id{get;set;}
    
    }
    
    public class FilhoTarefa:Tarefa
    {
    
    public string Descricao{get;set;}
    
    }
    
    
    
    private void MetodoQualquer()
    {
    
    Tarefa filho = new FilhoTarefa();
    filho.Id=1;
    filho.Descricao="Filho";
    
    }

    isto é mais útil quando você pode ter vários filhos diferentes FilhoTarefa2,FilhoTarefa4,FilhoTarefa3, dai pra instanciar todos pode dar um new direto na classe Tarefa.... se você tem uma lista de objetos por exemplo onde cada objeto é um filho diferente você pode fazer um foreach instanciando todos para Tarefa... mais ou menos assim:

    IList<Tarefa> listaFilhos= new List<Tarefa>();
    listaFilhos.add(new FilhoTarefa1());
    
    listaFilhos.add(new FilhoTarefa2());
    
    listaFilhos.add(new FilhoTarefa3());
    
    listaFilhos.add(new FilhoTarefa4());
    
    foreach(var filho in listaFilhos)
    
    {
    
    filho= new FilhoTarefa1();
    
    }



    na verdade é o contrário, tu instancia um objeto do tipo tarefa em filhos... 

    Tarefa tar= new TarefaFilho1();

    segunda-feira, 27 de agosto de 2012 19:45
  • no teu código ficaria
    public static Domain.Entity.Tarefa RetornarPorID(Domain.Finder.Tarefa _PesquisarTarefa)
            {
                SqlConnection _SqlConnection = new SqlConnection();
                SqlDataReader _SqlDataReader = null;
    
                try
                {
                    _SqlConnection = DataMapperHelper.AbreConexao();
    
                    List<SqlParameter> _ListSqlParameters = new List<SqlParameter>();
                    _ListSqlParameters.Add(new SqlParameter("IdTarefa", _PesquisarTarefa.IdTarefa));
    
                    _SqlDataReader = DAO.DAOBase.RetornarPorID(_SqlConnection, "JP_SEL_TarefaPorFiltro", _ListSqlParameters);
    
                    Domain.Entity.Tarefa _Tarefa = new Domain.Entity.TarefaFilho();
    
                    while (_SqlDataReader.Read())
                    {
                        Inicializar(_Tarefa, _SqlDataReader);
                    }
    
                    return _Tarefa;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (_SqlDataReader != null)
                    {
                        _SqlDataReader.Close();
                        _SqlDataReader.Dispose();
                    }
    
                    DataMapperHelper.FecharConexao(_SqlConnection);
                }
            }
    onde TarefaFilho você deve criar e fazê-la herdar de Tarefa
    segunda-feira, 27 de agosto de 2012 19:48
  • Em realidade esse conceito de Abstract factory, ainda não entrou em minha cabeça. Cara, to penando e atrasando a equipe, por falta de entendimento desse assunto. Isso que vc explicou eu entendi, é que até para passar a dúvida não sei como. Preciso implementar uma classe Abstract Factory, tipo, TarefaFactory, lá passar um método tipo Criar(SqlDataReader _SqlDataReader), mais ou menos isso:

    _SqlDataReader = DAO.DAOBase.RetornarPorID(_SqlConnection, "JP_SEL_TarefaPorFiltro", _ListSqlParameters);

                    Domain.Entity.Tarefa _Tarefa = TarefaFactory.Criar(_SqlDataReader);

    .......

    fazer isso, ou seja, dependendo da tarefa, executar a classe conveniente:

    TarefaFactory <- verifca a tarefa e chama outra factory responsável
    EnviaEmailFactory <- gera o EnviarEmail
    ExecutarDTSXFactory <- gera o ExecutarDTSX

    EnviaEmailFactory  >> EnviaEmail(Classe que sobreexcreve o método executa para enviar email)

    ExecutarDTSXFactory  >> xecutarDTSX(Classe que sobreexcreve o método executa para executar DTSX)

    E assim sucessivamente.

    Isso é que eu não estou conseguindo entender e consequentemente implementar.

    segunda-feira, 27 de agosto de 2012 23:21
  • cara eu realmente não sei se te entendi, mas o pouco que compreendi do que tu quer, seria assim...

    a tua classe tarefa é abstrata, ou seja, não pode ser instanciada, a tua TarefaFactory pelo que tu implementou seria uma classe statica que possui o método Criar onde o mesmo recebe o _SqlDataReader que vai dizer qual tarefa ele deve instanciar no teu objeto _Tarefa...

    se for isto, basta apenas deixar como está esta linha:

    Domain.Entity.Tarefa _Tarefa = TarefaFactory.Criar(_SqlDataReader);

    a tua classe TarefaFactory ficaria mais ou menos assim:

    public static class TarefaFactory
    
    {
    
    public static Tarefa Criar(SqlDataReader _SqlDataReader)
    
    {
    
    //aqui não sei bem certo como tu verificaria esse teu sql data reader mas digamos que seja assim
    
    
    if(_SqlDataReader=="tarefa1")
    
    return new Tarefa1();
    
    if(_SqlDataReader=="tarefa2")
    
    return new Tarefa2();
    
    if(_SqlDataReader=="tarefa3")
    
    return new Tarefa3();
    
    
    
    return null;
    
    
    }
    
    }

    desculpa se não é isso que tu quer, realmente não entendi ao certo...

    lembrando que Tarefa1, Tarefa2, Tarefa3 devem herdar de Tarefa
    • Editado M a i c o n quarta-feira, 29 de agosto de 2012 12:48 faltou informação
    terça-feira, 28 de agosto de 2012 11:00