Witam,
mam problem odnośnie punktu 10 z załącznika a dokładnie linijka "marka, model, silnik". Czy to oznacza, że konstruktor powinien być w konstruktorze ?
Tylko jak przypisać do parametru silnik, parametry z klasy silnik ?
Tylko jak to zrobić ?
Wiem jak przekazać parametr do konstruktora, ale nie za bardzo wiem jak stworzyć parametr obiekt klasy silnik.
Zrobiłem jaką część projektu ale mam problem...
Program główny:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("1.Marka\n2.Model\n3.Pojemność Silnika\n4.Ilość Paliwa\n5.Pojemność Baku");
//Samochod S1 = new Samochod(Console.ReadLine(),Console.ReadLine(), Convert.ToDouble(Console.ReadLine()), Convert.ToDouble(Console.ReadLine()));
Samochod s2 = new Samochod(Console.ReadLine(), Console.ReadLine(), Convert.ToDouble(Console.ReadLine()), Convert.ToDouble(Console.ReadLine()), Convert.ToDouble(Console.ReadLine()));
Console.Clear();
Console.WriteLine("Marka: " + s2.Marka);
Console.WriteLine("Model: " + s2.Model);
Console.WriteLine("Pojemnosc: " + s2.PojemnośćSilnika);
Console.WriteLine("Ilosc paliwa: " + s2.IlośćPaliwa);
Console.WriteLine("Pojemnosc baku: " + s2.PojemnośćBaku);
Console.WriteLine();
s2.Jedz();
}
}
}
Klasa silnik:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Silnik
{
private const double galon = 4.54; // stała wartość jednego galonu 1galon = 4,54 l
private const double mila = 1.609; //stała warotść jednej mili 1mila = 1,609 km
private static double a; // przelicznik z mili na kilometr
private static double mpgLkm;// wynik kowersji z mpg na l/100km
private static double lkmMpg;// wynik konwersji z l/100km na mpg
private double pojemnośćBaku = 60;
public double PojemnośćSilnika { get;private set; }
public double IlośćPaliwa { get;private set; }
public double PojemnośćBaku { get;private set; }
public static void LkmMpg(double lkm) // przelicznik z l/100km na mpg
{
lkmMpg = (282.5 / lkm);
Console.WriteLine(lkmMpg);
}
public static void MpgLkm(double mile) // przelicznik z mpg na l/100km
{
a = (mila * mile);
mpgLkm = (galon / a * 100);
Console.WriteLine(mpgLkm);
}
public Silnik(double newPojemnośćSilnika, double newIlośćPaliwa, double newPojemnośćBaku) // tworzy nowy silnik
{
this.PojemnośćSilnika = newPojemnośćSilnika;
this.IlośćPaliwa = newIlośćPaliwa;
this.PojemnośćBaku = newPojemnośćBaku;
}
}
}
Oraz klasa samochód:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;
namespace ConsoleApplication4
{
class Samochod
{
public double km;
private double spalone;
public double j;
public string decyzja;
public string Marka { get; private set; }
public string Model { get; private set; }
public double Paliwo { get;private set; }
public double Strata { get;private set; }
public double ResztaPaliwa { get; private set; }
Silnik s1 = new Silnik();
public Samochod(string newMarka, string newModel, double newPojemnośćSilnika, double newIlośćPaliwa, double newPojemnośćBaku)
{
this.Marka = newMarka;
this.Model = newModel;
s1.PojemnośćBaku = newPojemnośćBaku;
s1.PojemnośćSilnika = newPojemnośćSilnika;
s1.IlośćPaliwa = newIlośćPaliwa;
}
public void Jedz()
{
Console.WriteLine("Ile będziesz jechał kilometrów?");
km = Convert.ToInt32(Console.ReadLine());
if ((km / 100 * s1.PojemnośćSilnika * 4) > s1.IlośćPaliwa)
{
// Jeżeli nie ma wystarczającej ilości paliwa, użytkownik dostaje taką informację i może zatankować samochód.
Console.WriteLine("Nie masz wystarczającej ilości paliwa...");
ResztaPaliwa = s1.IlośćPaliwa;
Tankuj();
}
else if ((km / 100 * s1.PojemnośćSilnika * 4) <= s1.IlośćPaliwa)
{
Console.WriteLine();
Console.WriteLine("Jedz");
Console.WriteLine();
var watch = new Stopwatch();
watch.Start();
while (watch.Elapsed < TimeSpan.FromMilliseconds(km * 100))
{
// animacja poruszania się pojazdu
j += 1;
for (int i = 0; i < j; i++)
{
Console.Write(" ");
}
Console.Write("_________");
Console.WriteLine();
for (int i = 0; i < j; i++)
{
Console.Write(" ");
}
Console.Write("|_________\\");
Console.WriteLine();
for (int i = 0; i < j; i++)
{
Console.Write(" ");
}
Console.Write(" oo o");
Console.WriteLine();
if (j > 60)
{ j = 0; }
Thread.Sleep(50);
Console.Clear();
}
watch.Stop();
Console.Clear();
Dzialaj();
Console.WriteLine("Jestem\n");
Console.WriteLine("Zostało tyle paliwa:");
Console.WriteLine(s1.IlośćPaliwa);
s1.IlośćPaliwa = ResztaPaliwa;
Console.WriteLine("Czy chcesz jechać dalej ? (y/n)");
decyzja = Console.ReadLine();
if (decyzja == "y")
{
Jedz();
}
else if (decyzja == "n")
{
Console.Clear();
Console.WriteLine("\t\tKoniec jazdy");
Console.ReadKey();
}
}
}
public void Dzialaj()
{
spalone = km / 100 * s1.PojemnośćBaku * 4;
ResztaPaliwa = s1.IlośćPaliwa - spalone;
}
public void Tankuj()
{
Console.WriteLine("Ile paliwa zatankowac ?");
Paliwo = float.Parse(Console.ReadLine());
s1.PojemnośćBaku = ResztaPaliwa + Paliwo;
if (s1.IlośćPaliwa > s1.PojemnośćBaku)
{
Console.Clear();
Strata = s1.IlośćPaliwa - s1.PojemnośćBaku;
s1.IlośćPaliwa = s1.PojemnośćBaku;
Console.WriteLine("Przelałeś bak...\n straciłeś " + Strata + " litrów paliwa...");
Console.WriteLine("Teraz masz tyle paliwa:" + s1.IlośćPaliwa);
Jedz();
}
else if(s1.IlośćPaliwa <= s1.PojemnośćBaku)
{
Console.WriteLine("Teraz masz tyle paliwa:" + s1.IlośćPaliwa);
Jedz();
}
}
}
}
Mój problem polega na tym, że w klasie silnik są właściwości (Ilość paliwa, pojemność baku, oraz silnika), które muszą mieć prywatnego seta. Tylko jak w takim razie w klasie samochód stworzyć konstruktory, które będą charakteryzowały się w taki sposób :
marka,model,pojemnośćsilinka, ilość benzyny,pojemność baku.
marka,model,pojemnośćsilinka, ilość benzyny.
marka,model,silnik.
Samochód charakteryzuje się marką modelem oraz SILNIKIEM(nie rozumiem jak mam do właściwości przypisać silnik)
Coś robię źle tylko nie mam pojęcia co ...
private Silnik silnik;
public Silnik Silnik {
get { return silnik; }
private set;
}
public Samochod(Silnik silnik)
{
this.silnik = silnik;
}
moglem gdzies sie walnac bo pisane z palca
Czyli cały kod jest dobry i wystarczy wkleić w klasie samochód ten kod ?
nie patrzylem na caly kod, patrzylem na Twoje pytanie. Staram Ci sie pomoc dajac Ci wskazowki a nie gotowce ;)
Tylko to jest o ile dobrze rozumiem odpowiedź na jak przypisać silnik do właściwości. Ale dalej nie kumam co z pierwszym pytaniem...
Przykład:
public class Silnik
{
public double PojemnośćBaku { get; private set; } // W C# 6.0 wystarczy samo { get; } w tym przypadku
public double PojemnośćSilnika { get; set; }
public double IlośćPaliwa { get; set; }
public Silnik(double pojemnośćSilnika, double ilośćPaliwa, double pojemnośćBaku)
: this(pojemnośćSilnika, ilośćPaliwa)
{
this.PojemnośćBaku = pojemnośćBaku;
}
public Silnik(double pojemnośćSilnika, double ilośćPaliwa)
{
this.PojemnośćBaku = 15;
this.PojemnośćSilnika = pojemnośćSilnika;
this.IlośćPaliwa = ilośćPaliwa;
}
}
public class Samochod
{
public string Marka { get; private set; } // W C# 6.0 wystarczy samo { get; } w tym przypadku
public string Model { get; private set; } // W C# 6.0 wystarczy samo { get; } w tym przypadku
public Silnik Silnik { get; private set; } // W C# 6.0 wystarczy samo { get; } w tym przypadku
public Samochod(string marka, string model, double pojemnośćSilnika, double ilośćPaliwa, double pojemnośćBaku)
: this(marka, model, new Silnik(pojemnośćSilnika, ilośćPaliwa, pojemnośćBaku))
{
}
public Samochod(string marka, string model, double pojemnośćSilnika, double ilośćPaliwa)
: this(marka, model, new Silnik(pojemnośćSilnika, ilośćPaliwa))
{
}
public Samochod(string marka, string model, Silnik silnik)
{
Marka = marka;
Model = model;
Silnik = silnik;
}
}
Póki co dalej nie realizujesz punktu 3 w zakresie braku możliwości modyfikacji pojemności baku po utworzeniu.
Prywatny seter dalej umożliwia jego modyfikację.
Musisz użyć modyfikatora readonly.
I jeszcze jedno - nie pisze się "same" tylko "samo" :)
Readonly można zastosować tylko do pól, więc musiałby tworzyć dodatkowe pole prywatne (backing field), co jest moim zdaniem nadmiarowe. W tym punkcie chodzi bardziej o to, żeby nie możliwa była modyfikacja "z zewnątrz".
EDIT: W zasadzie użycie wyłącznie gettera załatwia sprawę (jak zaznaczył @DibbyDum poniżej)
@Sarrus Mówisz z pragmatycznego punktu widzenia, ale w szkole nie zawsze jest to preferowanym rozwiązaniem.
Wręcz często wszelkie uproszczenia są niemile widziane.
Ja bym zrobił same propfulle, aby pokazać, że umiem, a dla 1 czy 2 skrótowe propy.
public string Coś{ get; }
W C# 6.0 wygeneruje pole readonly.
Prywatny seter dalej umożliwia jego modyfikację.
Który kawałek kodu w mojej klasie umożliwia taką modyfikację?
A tak w ogóle moim głównym zamysłem było pokazania jak mogą wyglądać te konstruktory, cała reszta jest mało istotna w tym przykładzie.