• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Filipe11

Listas...

16 mensagens neste tópico

Boas pessoal...

:hmm:

Eu estou a fazer um programa, em que tenho uma classe(farmacias) em que tem uma lista de medicamentos(List<Medicamentos>), mas a classe medicamentos tem 3 subclasses...

Quando insiro um objecto na lista, tudo funciona bem....insiro por exemplo um objecto de uma subclasse (Comprimidos c.... // F.Add©)...mas quando quero aceder aos dados da lista, não consigo obter os atributos da subclasse...tenho uma função em farmacias que retorna um objecto da lista, mas como a lista é de medicamentos, apenas retorna os atributos da superclasse...não como fazer...Alguém me pode ajudar...(não sei se me expliquei bem...) :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa lá mas perdi-me a meio do texto.

Consegues ser um pouco mais explicito ?  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou esquematizar a ver se ajuda:

Class Farmacia
{
   private List<Medicamentos> M = new List<Medicamentos>();
   public Medicamentos k(string n)
   {
      .....
      return M[i]; 
   }
  public add(Medicamentos a)
{
     M.Add(a);
  }
}
Class Medicamentos
{
   string nome;
   ...
}
Class Comprimido:Medicamentos
{
   int nComprimidos;
}
Class Xarope:Medicamentos
{
   string embalagem;
}

Tenho por exemplo estas classes, e quando numa form quero aceder a isto faço..:

private Farmacias F = new Farmacias();

F.ad(...);

e quando faço:

F.k("***"");ele retorna um medicamento...e não os atributos da subclasse a que pertence,por exemplo Comprimidos...

não se melhorei...eu sei que é confuso...mas estou mesmo a precisar de ajuda...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim e é o comportamento correcto porque a tua lista M é do tipo Medicamentos.

Para te dar o tipo que queres ou fazes um cast (o que vai ser dificil pois não sabes o tipo) ou então em vez de teres uma lista de Medicamentos tens uma lista de Objectos.

Vou exemplificar

Class Farmacia
{
   private List<Object> Medicamentos = new List<Object>();

   public Object k(string n)
   {
      .....
      return Medicamentos;
   }
  public add(Object a)
{
     M.Add(a);
  }
}

Class Medicamentos
{
   string nome;
   ...
}

Class Comprimido:Medicamentos
{
   int nComprimidos;
}

Class Xarope:Medicamentos
{
   string embalagem;
}

Para os ieres buscar é simples


private Farmacias F = new Farmacias();

private Xarope x = new Xarope();
private Comprimido c = new Comprimido();

f.add(x);
f.add(c);

/* Para os ires ler podes fazer algo do genero */
foreach(Object obj in F.Medicamentos )
{
        if(obj is Xarope)
       {
                   Xarope a = (Xarope) obj;
                    ..........
       }
       else if(obj is Comprimido)
      {
               Comprimido comp = (Comprimido) obj;
              ..........
      }
}


Se tiveres duvidas diz.

Simplemente alterei o codigo que colocaste. Não testei nada...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No caso em que tenho

  public Object k(string n)

  {

      .....

      return Medicamentos;

  }

Eu estava a comparar o nome, então tenho que ter um objecto Medicamento a tomar o valor do ObjectO, certo??

como faço??

é algo deste genero?? List<Medicamentos> a = (Medicamentos)Object;

é que estou a procurar por nome na lista e preciso disto..e tambem tenho outro metodo de ordenar por ordem alfabetica que vou precisar disto...

!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim,preciso de comparar o nome do medicamento, e como a lis é de objectos nao posso fazer isso automaticamente!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Claro que podes.

   public Object Get(String name)
   {
       foreach (Object obj in Medicamentos) //aqui Medicamentos é a lista
       {
           if (obj is Medicamentos)
           {
               Medicamentos m = (Medicamentos)obj;
               if (m.nome.Equals(name))
               {
                   return obj;
                   break;
               }
           }
       }
   }

Acho que deves ler algo sobre como funcionam os objectos em C# e como funciona a herança de objectos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, eu tenho estado a ver, mas não tenho nada que explique muito bem...não sabes de nenhum e_book que me ajude??eu tenho o livro da FCA, mas nao me ajuda muito...

No caso que escreves-te anteriormente, em que medicamentos é a lista, vou ter criar uma lista de medicamentos para alem da lista de objectos??porque se fizer assim tal como tenho(sem ter uma lista de medicamentos dá um erro!)

//foreach (Object obj in Medicamentos)tenho de ter uma lista de medicamentos...secalhar nao estou a dizer nada d jeito mas...  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

class Farmacias
    {
       ...
        public List<Object> M = new List<Object>();
        private Medicamentos m=new Medicamentos();

public Object compara(String name)
        {
            foreach (Object obj in M) //aqui Medicamentos é a lista
            {
                if (obj is Medicamentos)
                {
                    Medicamentos m = (Medicamentos)obj;
                    if (m.Nome.Equals(name))
                    {
                        return obj;
                       
                    }
//para não dar erro vou ter que por a retornar valor null para o caso de não encontrar o medicamento pedido, pq senão da erro...
                }
           }
       }
public void ordena()
        {
            if (M.Count > 1)
            {
                foreach (Object obj in M) //aqui Medicamentos é a lista
                {
                    j++;
                    if (obj is Medicamentos)
                    {
                        Medicamentos m = (Medicamentos)obj;
                        foreach (Object obj1 in M)
                        {
                            i++;
                            if (obj is Medicamentos)
                            {
                                Medicamentos n = (Medicamentos)obj1;
                                if (string.Compare(m.Nome, n.Nome, false) > 0)
                                {
                                    Object aux = M[i];
                                    M[i] = M[j];
                                    M[j] = aux;
                                }
}}}}}}

Eu estava a fazer assim para ordenar, porque ainda não sei trabalhar muito bem com objectos;Assim não da erro,mas se eu usa-se M[i ].nome da erro (como é obvio)porque M é uma lista de objectos;

já gora, porque é que quando eu faço:

foreach (Object obj in F.M) 
                    {
                        if (obj is Medicamentos)
                        {
                            Medicamentos m = (Medicamentos)obj;
                            listBox2.Items.Add(m.Nome);
                        }
                       
                    }

na listBox aparece-me sempre o mesmo nome, imagina meto aaa, e bbb, e lá aparece duas vezes bbb!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelo artigo, mas lá eles usam "#region", mas eu ainda não sei trabalhar com isso!!!E para além disso, eles usam uma lista de Girls, e no meu caso, para poder aceder aos dados da subclasse, usei (conselho teu) lista de objectos...não me podes dar uma ajudinha no caso da ordenação??ja fix de 1000 e uma maneiras e nao consigo..;)

Eu li o artigo, e tentei implementar no meu caso mas não consegui!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para te dar o tipo que queres ou fazes um cast (o que vai ser dificil pois não sabes o tipo) ou então em vez de teres uma lista de Medicamentos tens uma lista de Objectos.

Não percebi muito bem porque é que sugeriste a utilização de uma lista de Object em vez de Medicamentos. Essa alteração só foi complicar o método k, e não trouxe benefício nenhum. Além de que agora não há restrição quanto aos tipos que podem ser inseridos na lista. Aliás, um dos motivos para a introdução de genéricos foi exactamente para evitar a generalização de Collections como contentores de Object.

Filipe11, eu sugeria que voltasses a utilizar uma List<Medicamentos> como tinhas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas se utilizar uma lista de medicamentos, vou ter  problemas em aceder aos dados das subclasses, como ja expliquei antes, (penso que tenho que implementar algo de polimorfismo, mas não estou a consequir)porque no metodo k, estou a retornar um elemento da lista,e depois não sei a que subclasse pertence...[não deve ser dificil, mas nao estou a ver bem]...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O código que o skm indicou com Object também serve com Medicamentos:

foreach(Medicamentos m in M) {
    if(m is Xarope) {
        Xarope a = (Xarope)m;
        //...
    } else if(m is Comprimido) {
        Comprimido comp = (Comprimido)m;
        //...
    }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora