none
POO (acesso aos metodos)

    Pergunta

  • Pessoal estou com algumas dúvidas e se alguém pudesse me orientar...

    Acho que nem vou conseguir me expressar...
    Estou tentando estudar a OO dentro do C#.net e o que eu fiz....


    tenho uma interface chamada     dao.cs     que contém as assinaturas dos meus métodos
        interface dao
        {
            object GetClienteDao(object cliente);
         //o que eu tentei fazer aqui era assinar uma função que ira ser implementada na classe abaixo
        }


    e tenho uma class sql_dao.cs  que implementa estes métodos
        public class sql_dao : dao
        {
            object dao.GetClienteDao(object cliente){
              return new SQL_cliente_dao();
           }
        //retorna uma instancia de sql_cliente_dao();
        }




    pois bem agora eu tenho uma interface chamada cliente_dao
        interface cliente_dao
        {
            string Store(object cliente);
           //duvida: como eu declaro uma funcao para insert no banco ?
         // por exemplo    public ???? store(objetc cliente)  public void ? public datareader ? public dataset ?
        }

    e tenho uma classe que implementa a interface cliente_dao chamada
        public class SQL_cliente_dao : cliente_dao
        {
       
          string cliente_dao.Store(Object cliente){
          return "Olá Mundo";
            //insert na tabela
            //Método de inserção na tabela
          }
       
        }

    bom a interface cliente_dao e a classe sql_cliente_dao  correspondem aos meus objetos do BD por exemplo....
    e a interface dao e sql_dao são dos meu bd (conexao, estado do banco e tal)


    e ainda eu declarei uma classe chamada dao_factory que retorna qual dao eu vou utilizar ..
        public class dao_factory
        {
            public object get_dao(){
              return new sql_dao();
     // também não sei se está certo....
            }
      }



    na View estou tentando fazer assim:


                string a = new dao_factory().get_dao().GetClienteDao().Store().ToString();


    mas me retorna erro dizendo que o metodos GetClienteDao nao existe e tal....



    bom minha dúvida para mim é bem complexa.... será que alguém pode me ajudar ? dizendo o caminho das pedras ?


    Obrigado






    Correr já não basta mais.... é necessário voar
    terça-feira, 4 de agosto de 2009 19:33

Respostas

  • Olá José

    Há algumas coisas que devem ser corrigidas nas classes/interfaces para que possam funcionar corretamente.

    1) Note que na classe dao_factory (no codigo PHP), o metodo é static. Logo deve ser tambem em sua classe C#.

    2) Suas interfaces devem ser publicas.

    3) Ao inves de definir o tipo de retorno das classes como "object" defina-o exatamente com o tipo que esta sendo retornado.

    4) Nao implemente explicitamente a interface na classe (isso quer dizer retirar o nome da interface da frente do nome do metodo) e defina esses metodos como publicos tambem.

    O código corrigido segue abaixo:

       public interface dao
        {
            SQL_cliente_dao GetClienteDao(object cliente);
        }

        public interface cliente_dao
        {
            string Store(object cliente);
        }

        public class sql_dao : dao
        {
            public SQL_cliente_dao GetClienteDao(object cliente)
            {
                return new SQL_cliente_dao();
            }   
        }
       
        public class SQL_cliente_dao : cliente_dao
        {
            public string Store(object cliente)
            {
                return "Olá Mundo";
            }      
        }

        public class dao_factory
        {
            public static sql_dao get_dao()
            {
                return new sql_dao();
            }
        }


    A chamada fica assim:

    string a = dao_factory.get_dao().GetClienteDao("lixo").Store("lixo");

    obs.: Note que nao ha o "new" uma vez que o metodo get_dao() é estatico.

    obs 2: Note que como os metodos GetClienteDao e Store recebem um object eu apenas joguei um "lixo" ali para chama-los corretamente.

    obs 3. Convem que esse "object" Cliente passado nos metodos acima tambem seja convertido para um tipo especifico (da classe Cliente por exemplo). Trabalhar com objects pode ser perigoso (trazer erros inesperados em tempo de execução), alem de custoso (muita conversao de tipos).

    []s



    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    terça-feira, 4 de agosto de 2009 22:24
  • Olá, desculpe acabei não lendo seu código com a devida atenção
    Melhor já retornar sim o tipo que deseja ao invés de Object pra evitar as conversões

    Veja a lista de considerações do Robson, contempla sua questão e há várias outras dicas úteis

    []s
    http://www.marceloramos.net/Blog


    Marcelo Ramos
    terça-feira, 4 de agosto de 2009 23:28
  • opa obrigado por responder...


    Cara deu certinho... Obrigado mesmo...


    Agora está retornando uma string certo ... 

    se o código fosse um método de inserção no BD eu usaria void ?
    Correr já não basta mais.... é necessário voar
    quarta-feira, 5 de agosto de 2009 14:17
  • opa...

    Valew...

    você sabe me dizer uma vantagem de usar interface ?

    Correr já não basta mais.... é necessário voar
    quarta-feira, 5 de agosto de 2009 14:17
  • E na metodologia MVC onde estas classes estariam ? 

    tipo a sql_cliente_dao estaria no control ?

    dao estaria no model ?

    Correr já não basta mais.... é necessário voar
    quarta-feira, 5 de agosto de 2009 14:20

Todas as Respostas

  • Olá, pelo que eu li do seu código, o get_dao() do dao_factory retorna um Object.
    Pra usar o GetClienteDao() teria que converter o objeto no tipo correto ( sql_dao )

    string a = new ((sql_dao)dao_factory().get_dao()).GetClienteDao();

    espero que ajude

    []s
    http://www.marceloramos.net/Blog

    Marcelo Ramos
    terça-feira, 4 de agosto de 2009 19:54
  • Opa obrigado por responder....


    hum... não deu certo...
    mas está certo assim retornando um objeto ? pois o que eu queria realmente era retornar uma class do tipo GetClientDao....



    Correr já não basta mais.... é necessário voar
    terça-feira, 4 de agosto de 2009 21:05
  • Na verdade assim... vou colocar o código em PHP que estou tentando reescrever em C#.net...


    class dao_factory {
        public static function get_dao() {
        return new mysql_dao();
    }



    interface dao {
        public function get_cliente_dao();
    }


    class mysql_dao implements dao {
        public function get_cliente_dao() {
            return new mysql_cliente_dao();       
        }
    }



    interface cliente_dao {
        public function    store($cliente);
    }


    class mysql_cliente_dao extends mysql_dao implements cliente_dao {
        public function    store($cliente) {
         //insercao no bd
       }
    }




    Na view

    $clientes = dao_factory::get_dao()->get_cliente_dao()->store(ObjetoClientes);




    Estou tentando fazer isto em C#.net mass

    Correr já não basta mais.... é necessário voar
    terça-feira, 4 de agosto de 2009 21:14
  • Olá José

    Há algumas coisas que devem ser corrigidas nas classes/interfaces para que possam funcionar corretamente.

    1) Note que na classe dao_factory (no codigo PHP), o metodo é static. Logo deve ser tambem em sua classe C#.

    2) Suas interfaces devem ser publicas.

    3) Ao inves de definir o tipo de retorno das classes como "object" defina-o exatamente com o tipo que esta sendo retornado.

    4) Nao implemente explicitamente a interface na classe (isso quer dizer retirar o nome da interface da frente do nome do metodo) e defina esses metodos como publicos tambem.

    O código corrigido segue abaixo:

       public interface dao
        {
            SQL_cliente_dao GetClienteDao(object cliente);
        }

        public interface cliente_dao
        {
            string Store(object cliente);
        }

        public class sql_dao : dao
        {
            public SQL_cliente_dao GetClienteDao(object cliente)
            {
                return new SQL_cliente_dao();
            }   
        }
       
        public class SQL_cliente_dao : cliente_dao
        {
            public string Store(object cliente)
            {
                return "Olá Mundo";
            }      
        }

        public class dao_factory
        {
            public static sql_dao get_dao()
            {
                return new sql_dao();
            }
        }


    A chamada fica assim:

    string a = dao_factory.get_dao().GetClienteDao("lixo").Store("lixo");

    obs.: Note que nao ha o "new" uma vez que o metodo get_dao() é estatico.

    obs 2: Note que como os metodos GetClienteDao e Store recebem um object eu apenas joguei um "lixo" ali para chama-los corretamente.

    obs 3. Convem que esse "object" Cliente passado nos metodos acima tambem seja convertido para um tipo especifico (da classe Cliente por exemplo). Trabalhar com objects pode ser perigoso (trazer erros inesperados em tempo de execução), alem de custoso (muita conversao de tipos).

    []s



    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    terça-feira, 4 de agosto de 2009 22:24
  • Olá, desculpe acabei não lendo seu código com a devida atenção
    Melhor já retornar sim o tipo que deseja ao invés de Object pra evitar as conversões

    Veja a lista de considerações do Robson, contempla sua questão e há várias outras dicas úteis

    []s
    http://www.marceloramos.net/Blog


    Marcelo Ramos
    terça-feira, 4 de agosto de 2009 23:28
  • opa obrigado por responder...


    Cara deu certinho... Obrigado mesmo...


    Agora está retornando uma string certo ... 

    se o código fosse um método de inserção no BD eu usaria void ?
    Correr já não basta mais.... é necessário voar
    quarta-feira, 5 de agosto de 2009 14:17
  • opa...

    Valew...

    você sabe me dizer uma vantagem de usar interface ?

    Correr já não basta mais.... é necessário voar
    quarta-feira, 5 de agosto de 2009 14:17
  • E na metodologia MVC onde estas classes estariam ? 

    tipo a sql_cliente_dao estaria no control ?

    dao estaria no model ?

    Correr já não basta mais.... é necessário voar
    quarta-feira, 5 de agosto de 2009 14:20