Zadanie z programowania obiektowego - konstruktory

0

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 ?

0

Tylko jak przypisać do parametru silnik, parametry z klasy silnik ?

0

Tylko jak to zrobić ?

0

Wiem jak przekazać parametr do konstruktora, ale nie za bardzo wiem jak stworzyć parametr obiekt klasy silnik.

0

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

1
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

0

Czyli cały kod jest dobry i wystarczy wkleić w klasie samochód ten kod ?

1

nie patrzylem na caly kod, patrzylem na Twoje pytanie. Staram Ci sie pomoc dajac Ci wskazowki a nie gotowce ;)

0

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

1

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;
    }
}
0

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" :)

0

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)

0

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1