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?
static void printProduct( List <Car> carList )
blir väl bra.
Men då är det ju specifikt carList. Kan jag anropa samma funktion med: printProduct(List <Mc> mcList); sedan?
Har bilen och mc någon superklass?
Nej, inte som det ser ut nu.
Men du har två separata klasser mc och bil?
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.
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.
Visa all kod du har. Båda klasserna och allt annat.
Lägg upp det formaterat såhär, så blir det enkelt att läsa.
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();
};
}
}
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
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...?
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
}
}
}
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.