Avatar billede sk-man Nybegynder
30. september 2013 - 20:37 Der er 8 kommentarer

Iterering over liste af objekter der implementerer et interface

Her er nok et nybegynder spørgsmål. Jeg har prøvet at simplificere problemet lidt...

Jeg har et interface der implementeres  to klasser:

public interface ITools { Decimal Price() }
public class Saw : ITools { void Pull(){}; Decimal Price(){};}
public class Hammer : ITools { void Swing(){}; Decimal Price(){};  }

I mit program har jeg så en collection med Saws og Hammers.

List<ITools> tools = new List<ITools>(); 
Tools.Add(new Hammer());
Tools.Add(new Hammer());
Tools.Add(new Saw());

Hvordan itererer jeg bedst over tools og på baggrund af objectets type kalder enten Pull() hvis det er en Saw eller Swing() hvis det er en Hammer?

Jeg er selv ude i noget i retning af følgende, men der må da være en bedre måde:

Foreach( var tool in tools) {
  If (tool is Hammer)
  {
    var hammer = tool as Hammer;
    hammer.Swing();
  }
  else if (tool is Saw)
  {
    var saw = tool as Saw;
    saw.Pull();
  }
}

Kan man lave noget med generics, linq eller?
Avatar billede arne_v Ekspert
30. september 2013 - 20:42 #1
Den rigtige OO maade er at give ITools en Use metode og saa kalde den.

At teste paa typen er anti-OO.
Avatar billede arne_v Ekspert
30. september 2013 - 20:43 #2
Ioevrigt bruger man normalt:

is og cast

eller:

as og test for null
Avatar billede montago Praktikant
01. oktober 2013 - 15:10 #3
foreach(var hammer in tools.Where(w => w is Hammer).Cast<Hammer>())
  hammer.Swing()

foreach(var saw in tools.Where(w => w is Saw).Cast<Saw>())
  hammer.Pull()

har jeg selv brugt tit i UI sammenhæng (XAML)

det er ikke så pænt, hvilket arne har ret i.. men whatever works, plejer at være fint i små projekter :)
Avatar billede MadsHaupt Juniormester
02. oktober 2013 - 13:43 #4
Jeg ville gør så dan her:
Klasser:
public interface ITools {
        void Work();
        decimal Price();
    }
    public class Saw : ITools {
        void Pull()
        {

        }
        private void ITools.Work()
        {
            Pull();
        }
        decimal ITools.Price()
        {
            return 0;
        }
    }
    public class Hammer : ITools
    {
        void Swing()
        {

        }
        private void ITools.Work() {
            Swing();
        }
        decimal Price()
        {
            return 0;
        } 
    }


Kode:
List<ITools> tools = new List<ITools>();
            tools.Add(new Hammer());
            tools.Add(new Hammer());
            tools.Add(new Saw());
            foreach(ITools tool in tools)
            {
                tool.Work();
            }
Avatar billede montago Praktikant
02. oktober 2013 - 13:47 #5
du kan også skide på det hele og bruge Dynamic:

[code]
foreach(dynamic hammer in tools.Where(w => w is Hammer))
  hammer.Swing()

foreach(dynamic saw in tools.Where(w => w is Saw))
  saw.Pull()

[/code]
Avatar billede montago Praktikant
02. oktober 2013 - 13:48 #6
hvordan laver man code sections ?? hvad er BB-koden til disse ?
Avatar billede arne_v Ekspert
02. oktober 2013 - 19:22 #7
Avatar billede montago Praktikant
02. november 2013 - 22:14 #8
Hey SK-MAN .... fik du løst problemet ???
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester