SkyLiNe napisał(a)
Oj, chyba jednak instr jest typu GITARA.
Instrument instr
nosz k*** albo ja czytać nie umiem albo Ty
No dlaczego używamy:
Instrument instr = new Gitara();
a nie:
Gitara instr = new Gitara();
czuję tą różnicę, ale chciałbym dobitne wyjaśnienie :).
bo tak sobie napisałeś :> Nie wiem skąd wziąłeś stwierdzenia w tonie "dlaczego używamy" czy "jest lepszy". Nikt, nigdzie nie powiedział "masz robić Instrument ins = new Gitara() a nie Gitara ins = new Gitara() bo ........ (wstaw co chcesz)". To wynika z problemu, który rozwiązujesz!
Może przykład do Ciebie bardziej trafi
Zadanie: Napisz program, gdzie będzie można podać dowolną ilość figur typu okrąg, kwadrat, prostokąt, trójkąt równoboczny, wczytaj odpowiednie dane dla każdej z nich (np. dla koła promień, dla kwadratu bok a, dla prostokąta boki a i b, dla trójkąta podstawa i wysokość) a następnie wylistuj pole i obwód każdej z nich w kolejności wprowadzania.
Z dziedziczeniem robię tak
public abstract class Figura
{
public abstract double Pole();
public abstract double Obwod();
}
public class Okrag : Figura
{
private double promien = 0.0;
public Okrag(double promien)
{
this.promien = promien;
}
public override double Pole()
{
return pi * promien * promien;
}
public override double Obwod()
{
return 2 * pi * promien;
}
}
public class Prostokat : Figura
{
private double a = 0.0;
private double b = 0.0;
public Prostokat(double a, double b)
{
this.a = a;
this.b = b;
}
public override double Pole()
{
return a * b;
}
public override double Obwod()
{
return 2 * a + 2 * b;
}
}
public class Kwadrat : Prostokat
{
public Kwadrat(double a) : base(a, a) { }
}
public class Trojkat : Figura
{
private double a = 0.0;
private double h = 0.0;
public Trojkat(double a, double h)
{
this.a = a;
this.h = h;
}
public override double Pole()
{
return a * h / 2;
}
public override double Obwod()
{
return 3 * a;
}
}
//i teraz główna metoda programu, która tworzy listę figur, dodaje jakieś figury a potem wypisuje po kolei ich pola i obwody
public ...
{
private List<Figura> listaFigur = new List<Figura>();
//dodaje "losowo" różne figury z różnymi danymi
listaFigur.Add(new Kolo(12));
listaFigur.Add(new Kolo(1.2));
listaFigur.Add(new Kwadrat(9467));
listaFigur.Add(new Kolo(10.3));
listaFigur.Add(new Trojkat(12, 2));
listaFigur.Add(new Kolo(15));
listaFigur.Add(new Kwadrat(3.56));
listaFigur.Add(new Trojkat(2, 12));
listaFigur.Add(new Trojkat(22, 22));
listaFigur.Add(new Kolo(1));
listaFigur.Add(new Kolo(1.63));
listaFigur.Add(new Kwadrat(12));
listaFigur.Add(new Trojkat(1.3, 2));
listaFigur.Add(new Kwadrat(10));
listaFigur.Add(new Prostokat(12, 2));
listaFigur.Add(new Kolo(122));
//wypisanie danych
foreach (Figura f in listaFigur)
{
Console.WriteLine("Pole: {0} Obwód: {1}", f.Pole(), f.Obwod());
}
}
Chodzi o to, że zarówno samą listę jak i kawałek kodu wypisujący dane guzik obchodzi co za klasy (figury) są na tej liście. Ważne jest tylko, że każda z tych klas MUSI dziedziczyć po klasie Figura.
Bez dziedziczenia będzie dużo więcej kodu na listowanie, każdy typ figur musiałbyś trzymać na osobnej liście i pamiętać kolejność ich dodawania. Przy dziedziczeniu dodanie nowej figury sprowadza się do napisania jej klasy i tyle, bez dziedziczenia dochodzi kolejna lista dla nowej klasy.
Mam nadzieję, że załapałeś bo jak nie to mi pomysły się skończyły jak Ci to przedstawić. Żeby zrozumieć jak działa dziedziczenie musisz najpierw zrozumieć po co ono w ogóle jest