15 svar
58 visningar
NikBjo 12
Postad: 15 nov 12:46 Redigerad: 15 nov 13:48

Pass list as parameter to a function/method

Hej.

Jobbar med listor som är baserade på klasser. T.ex. klass som Car (Blå, Toyota, 1948), Mc (Grön, Kawasaki, 800) o.s.v. När jag gör nya Bilar eller motorcyklar så sparas de i olika listor, t.ex. List <Car> carList = new List <Car> och <Mc> mcList = new List <Mc>.

Nu vill jag i programklassen göra en funktion som hjälper mig att lista alla bilar och motorcyklar som skapats.

Ex. static void printProduct( {vald lista} ){
...};
Anrop: printProduct(List <Car> carList);

Jag vill också i funktionen kunna använda mig av en metod i den specifika klassen, t.ex. printSpecification().
Så i:
printProduct( {vald lista} ){
foreach (var info in {vald lista} ){
    info.printSpecification(); //Metod i Car och Mc klassen.
}

Mina frågor är hur jag definierar parametern i funktionen för att den ska acceptera en Lista och om jag kan använda mig av klassens metoder i funktionen?

Laguna Online 16914
Postad: 15 nov 13:28

static void printProduct( List <Car> carList )

blir väl bra.

NikBjo 12
Postad: 15 nov 13:36

Men då är det ju specifikt carList. Kan jag anropa samma funktion med: printProduct(List <Mc> mcList); sedan?

beerger 937
Postad: 15 nov 13:39

Har bilen och mc någon superklass?

NikBjo 12
Postad: 15 nov 13:48

Nej, inte som det ser ut nu.

beerger 937
Postad: 15 nov 13:48

Men du har två separata klasser mc och bil?

NikBjo 12
Postad: 15 nov 13:49

Ja.

beerger 937
Postad: 15 nov 13:50

Skulle vara smidigt att ha en abstract superklass, fordon t.ex.

Vad abstract betyder kan du läsa här.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract

Då kan du lägga in en abstract printmetod i fordon, som tvingar att både mc och bil implementerar sin egna definition av denna metod.

NikBjo 12
Postad: 15 nov 14:07

Har läst igenom om abstract, men förstår inte riktigt hur den hjälper till att printa ut "fordonen" från listorna. Listorna ligger definierade i Main.

beerger 937
Postad: 15 nov 14:15

Visa all kod du har. Båda klasserna och allt annat.

beerger 937
Postad: 15 nov 14:16

Lägg upp det formaterat såhär, så blir det enkelt att läsa. 

NikBjo 12
Postad: 15 nov 14:38

 

Bilklass. Samma (kopia) men med Fruits.

namespace Test
{
    class Car{

        protected string color;
        protected string model;

        public Car (string inputColor, string inputModel){

            color = inputColor;
            model = inputModel;            

        }
        public void whritePropertyForCar(){
            Console.WriteLine($"Färg: {color}");
            Console.WriteLine($"Modell: {model}");
        }

    }
}

Program:

using System;
using System.Collections.Generic;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Car> listCars = new List<Car>();
            List<Fruit> listFruit = new List<Fruit>();
            
	listCars.Add(new Car("Blå", "Toyota"));
	listFruit.Add(new Fruit("Banan", "20"));         

       	printProduct(List<Car> listCars; //Funkar
	printProduct(List<Fruit> listFruit; // Vill att denna ska funka.

        }

       static void printProduct(List<Car> listCars){
            if (listCars.Count > 0){
                int amountCars = 1;
                foreach (var carInfo in listCars){
                    Console.WriteLine($"Bil nr: {amountCars}");
                    carInfo.whritePropertyForCar(); //Funktion i klassen Car    
                    Console.WriteLine();
                    amountCars++;
                }
                } else {
                    Console.WriteLine("Du har inga bilar i listan.");
                    Console.WriteLine();
                    }; 
    }
}
beerger 937
Postad: 15 nov 16:34 Redigerad: 15 nov 16:36

Lägg printProduct i varje klass, istället för att definiera denna i main.

Alternativt låt klasserna ärva från en superklass Fordon, och sedan tar printProduct in List<Fordon> listFordon

NikBjo 12
Postad: 15 nov 17:38

Det är just detta som jag har svårt att få grepp om. Om jag lägger printProdukt() i varje klass eller en superklass så kommer jag ju inte åt listan {List<Car> listCars = new List<Car>();}, eftersom den är initierad i Main. Initierar jag listan i kunstruktorn i klasserna så kommer jag inte åt listan i Main för att lägga till nya objekt {listCars.Add(new Car("Blå", "Toyota"));}.

Jag kan ju självklart skriva en printProdukt() för varje klass ( ex. Car, Mc, Frukter, mm.) som jag gör, men min tanke var att bara behöva skriva funktionen printProdukt() en gång, och återanvända den för varje lista.

Kanske har jag tänkt helt fel...?

beerger 937
Postad: 15 nov 18:06

Antingen såhär, där du har en abstract superklass Vehicle som håller fälten med färg/modell. Den har en printproduct, men då kan du lägga in både bilar och MCs i listan i main.

using System;
using System.Collections.Generic;


namespace Test
{
    abstract class Vehicle
    {
        protected string color;
        protected string model;

        public void writePropertyForVehicle()
        {
            Console.WriteLine($"Färg: {color}");
            Console.WriteLine($"Modell: {model}");
        }

        public static void printProduct(List<Vehicle> listVehicles)
        {
            if (listVehicles.Count > 0)
            {
                int amountVehicles = 1;
                foreach (var vehicleInfo in listVehicles)
                {
                    Console.WriteLine($"{vehicleInfo.toString()} nr: {amountVehicles}");
                    vehicleInfo.writePropertyForVehicle();
                    Console.WriteLine();
                    amountVehicles++;
                }
            }
            else
            {
                Console.WriteLine("Du har inga bilar i listan.");
                Console.WriteLine();
            };
        }

        public abstract String toString();
    }

    class Car : Vehicle
    {
        public Car(string inputColor, string inputModel)
        {
            color = inputColor;
            model = inputModel;
        }

        public override String toString()
        {
            return "Bil";
        }
    }

    class MC : Vehicle
    {
        public MC(string inputColor, string inputModel)
        {
            color = inputColor;
            model = inputModel;
        }

        public override String toString()
        {
            return "MC";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Vehicle> listCars = new List<Vehicle>();

            listCars.Add(new Car("Blå", "Toyota"));
            listCars.Add(new Car("Grön", "Toyota"));

            Vehicle.printProduct(listCars); //Funkar
        }
        }
    }

Alternativt såhär om du vill strunta i en superklass

using System;
using System.Collections.Generic;


namespace Test
{
    class Car
    {
        protected string color;
        protected string model;
        public Car(string inputColor, string inputModel)
        {
            color = inputColor;
            model = inputModel;
        }

        public static void printCars(List<Car> listCars)
        {
            if (listCars.Count > 0)
            {
                int amountCars = 1;
                foreach (var carInfo in listCars)
                {
                    Console.WriteLine($"Bil nr: {amountCars}");
                    carInfo.writePropertyForCar(); //Funktion i klassen Car    
                    Console.WriteLine();
                    amountCars++;
                }
            }
            else
            {
                Console.WriteLine("Du har inga bilar i listan.");
                Console.WriteLine();
            }
        }

        public void writePropertyForCar()
        {
            Console.WriteLine($"Färg: {color}");
            Console.WriteLine($"Modell: {model}");
        }
    }

    class MC
    {
        protected string color;
        protected string model;
        public MC(string inputColor, string inputModel)
        {
            color = inputColor;
            model = inputModel;
        }

        public static void printMCs(List<MC> listMC)
        {
            if (listMC.Count > 0)
            {
                int amountMC = 1;
                foreach (var mcInfo in listMC)
                {
                    Console.WriteLine($"MC nr: {amountMC}");
                    mcInfo.writePropertyForMC(); //Funktion i klassen Car    
                    Console.WriteLine();
                    amountMC++;
                }
            }
            else
            {
                Console.WriteLine("Du har inga MCs i listan.");
                Console.WriteLine();
            }
        }

        public void writePropertyForMC()
        {
            Console.WriteLine($"Färg: {color}");
            Console.WriteLine($"Modell: {model}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Car> listCars = new List<Car>();
            List<MC> listMC = new List<MC>();

            listCars.Add(new Car("Blå", "Toyota"));
            listCars.Add(new Car("Grön", "Toyota"));

            listMC.Add(new MC("Blå", "Toyota"));
            listMC.Add(new MC("Grön", "Toyota"));

            Car.printCars(listCars); //Funkar
            MC.printMCs(listMC); //Funkar


        }
    }
}
NikBjo 12
Postad: 15 nov 18:51

Tack!
Men det betyder alltså fortfarande att det inte funkar att bara göra en metod och lägga in en lista som parameter?

Som jag fattar det så behöver jag välja att lägga en metod i varje klass, eller göra en lista för en superklass och då samla alla olika fordon/produkter i samma lista.

Svara Avbryt
Close