Jump to content
  • Revista PROGRAMAR: J√° est√° dispon√≠vel a edi√ß√£o #60 da revista programar. Faz j√° o download aqui!

Sign in to follow this  
Filipe11

Listas...

Recommended Posts

Filipe11

Boas pessoal...

ūü§Ē

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

Share this post


Link to post
Share on other sites
skm

Desculpa l√° mas perdi-me a meio do texto.

Consegues ser um pouco mais explicito ?  :P


"There are two kinds of programmers. Those who write something to get the work done and those who want to write good code."Jo√£o Brand√£oWebsite e blog: http://jamab.blogspot.com/

Share this post


Link to post
Share on other sites
Filipe11

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...

Share this post


Link to post
Share on other sites
skm

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...


"There are two kinds of programmers. Those who write something to get the work done and those who want to write good code."Jo√£o Brand√£oWebsite e blog: http://jamab.blogspot.com/

Share this post


Link to post
Share on other sites
Filipe11

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...

!!

Share this post


Link to post
Share on other sites
Filipe11

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

Share this post


Link to post
Share on other sites
skm

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


"There are two kinds of programmers. Those who write something to get the work done and those who want to write good code."Jo√£o Brand√£oWebsite e blog: http://jamab.blogspot.com/

Share this post


Link to post
Share on other sites
Filipe11

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:

Share this post


Link to post
Share on other sites
skm

Que erro d√° ?

Posta ai o codigo assim é mais facil ajudar-te


"There are two kinds of programmers. Those who write something to get the work done and those who want to write good code."Jo√£o Brand√£oWebsite e blog: http://jamab.blogspot.com/

Share this post


Link to post
Share on other sites
Filipe11

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!!

Share this post


Link to post
Share on other sites
skm

O metodo de ordenação esta mal..

Lê este artigo e tentar corrigir-lo

http://devpinoy.org/blogs/keithrull/archive/2007/03/23/sorting-a-generic-list-of-object-in-c-using-icomparable-and-anonymous-delegates.aspx

Acho que assim vais ficar a preceber. Sen√£o diz que ajudo-te


"There are two kinds of programmers. Those who write something to get the work done and those who want to write good code."Jo√£o Brand√£oWebsite e blog: http://jamab.blogspot.com/

Share this post


Link to post
Share on other sites
Filipe11

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!!!

Share this post


Link to post
Share on other sites
TheDark

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.


Desaparecido.

Share this post


Link to post
Share on other sites
Filipe11

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]...

Share this post


Link to post
Share on other sites
TheDark

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;
        //...
    }
}


Desaparecido.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.