Dziedziczenie z klasy.

0

Witam, od niedawna uczę się programowania. Podstawy jakieś tam znam z dziedziczenia jednak czasem mnie przerastają. Teraz niestety widzę, że albo się nauczę albo będę niepotrzebnie pisał kod który będzie nie estetyczny.

Podaje przykład bardzo okrojony lecz dobrze pokazujący mój problem.

Mam jakąś podstawową klasę obiektu który do tego przykładu nada się najlepiej.

 public class Uczeń
    {
        public Uczeń(int NrDziennika, string Imię, string Nazwisko)
        {
            this.NrDziennika = NrDziennika;
            this.Imię = Imię;
            this.Nazwisko = Nazwisko;
        }

        public int NrDziennika { get; set; }
        public string Imię { get; set; }
        public string Nazwisko { get; set; }

        public override string ToString()
       {
              return String.Format("Uczeń {0} {1} o nr. Dzienika: {2}",Nazwisko,Imię,NrDziennika);
       }


    }
 

Następnie mam zbudowany model klasy który posiada kolekcję w postaci Listy oraz niezbędne metody które ułatwiają odwołanie się do kolekcji

 
public class Klasa
    {
        private List<Uczeń> ListaUczniów = new List<Uczeń>();

        public void AddNewUczeń (Uczeń nowyUczeń)
        {
            ListaUczniów.Add(nowyUczeń);
        }

        public Uczeń GetUczeń(int nrDziennika)
        {
           foreach(var uczeń in ListaUczniów)
            {
                if(uczeń.NrDziennika == nrDziennika)
                {
                    return uczeń;
                }
            }

            return null;
        }
    }

Wiem, dla przykładu Uczeń oraz klasa można by było wykonać 100 razy lepsze rozwiązania i nie komplikując sobie życia. Ale nie chodzi mi tutaj o zaprojektowaniu klasy tylko o zrozumienie pewnej zasady.

Co chce osiągnąć.

Jak stworzyć klasę powiedzmy

public class Klasa_Technikum : Klasa
{
....
public class Klasa_Liceum : Klasa
{
....

w konstrukcji klasy powiedzmy automatycznie z poziomu kodu dodał bym jakiś uczniów do Listy z class Klasy

a implementacja w programie u umożliwiała by mi następująco

 
Klasa_Technikum _klasa_Technikum = new Klasa_Technikum();
_klasa_Technikum.AddNewUczeń(new Uczeń(23,Jacek,Nowak));

Klasa_Liceum _klasa_Liceum = new Klasa_Liceum();
_klasa_Liceum.AddNewUczeń(new Uczeń(23,Adam,Nowak));

console.writeLine(_Klasa_Technikum.GetUczeń(11));
console.writeLine(_Klasa_Technikum.GetUczeń(23));
console.writeLine(_Klasa_Liceum.GetUczeń(11));
console.writeLine(_Klasa_Liceum.GetUczeń(23));

1
  1. beznadziejne nazywanie klas. Klasy powinny miec nazwy takie ktore odpowiadaja co robia
  2. Klasa jest po prostu nie potrzebna, bo jest to tylko wrapper na liste. W List<T> masz funkcje find. Mozesz uzyc lambdy do tego
  3. Mozesz tak zrobic, ale po co? Czym sie rozni w tym wypadku klasa Technikum od klasy Liceum?
  4. oba maja id po 23 wiec przy 11 oba zwroca null bo takiego obiektu nie ma.

To co sie stalo, to dla tych obiektow zostaly stworzone osobne listy

Co Ty chcesz osiagac?

0

fasadin tak jak pisałem wcześniej.

W konstrukcji klasy Klasa_Liceum czy Klasa_Technikum

public class Klasa_Technikum : Klasa
{

public Klasa_Technikum()
{
ManualAdd();
}

private void ManualAdd()
{
// Tutaj chciał bym się odwołać do zbioru z "Klasa" i powiedzmy dodać listę uczniów do 22;
}

}

Konstrukcja klas jest beznadziejna to fakt i nawet takiej nie chce zrobić. Jest to przykład który przyszedł mi do głowy by opisać go na forum.
Klasa_Technikum czy Liceum różniła by się powiedzmy jeszcze innymi parametrami których myślę nie trzeba podawać dla tego przykładu który ja chce zrozumieć.

1

Wydaje mi się, że powinieneś tutaj zastosować interfejs.

0

Więc może przykład podam, robię sobie kalkulator do pewnej gry. Rodzajów kopalni jest multum. A obliczeń jakich można dokonać, nawet w głowie mi się nie mieści. Wszystkie rodzaje kopalń operują na obiekcie WorkStation. Różnią się tylko parametrami. Obliczenia dla nich będą identyczne.

I teraz w sytuacji, gry rozbuduję sobie możliwość wyliczeń. Chciał bym mechanizm zmienić tylko w jednym miejscu a nie w 20 klasach.

 public class LumberMillColection 
    {
        public LumberMillColection()
        {
            Adding();
        }

        private List<WorkStation> Colection = new List<WorkStation>();

        private void Adding()
        {
            Colection.Add(new WorkStation(1, 50, 60, 40, 5, 30));
            Colection.Add(new WorkStation(2, 63, 77, 50, 1, 35));
            Colection.Add(new WorkStation(3, 78, 98, 64, 1, 41));
            Colection.Add(new WorkStation(4, 98, 124, 77, 1, 47));
            Colection.Add(new WorkStation(5, 122, 159, 96, 1, 55));
            Colection.Add(new WorkStation(6, 153, 202, 120, 1, 64));
            Colection.Add(new WorkStation(7, 191, 258, 149, 2, 74));
            Colection.Add(new WorkStation(8, 238, 329, 185, 2, 86));
            Colection.Add(new WorkStation(9, 298, 419, 231, 2, 100));
            Colection.Add(new WorkStation(10, 373, 534, 287, 2, 117));
            Colection.Add(new WorkStation(11, 466, 681, 358, 3, 136));
            Colection.Add(new WorkStation(12, 582, 868, 446, 3, 158));
            Colection.Add(new WorkStation(13, 728,1107, 555, 4, 184));
            Colection.Add(new WorkStation(14, 909, 1412, 691, 5, 214));
            Colection.Add(new WorkStation(15, 1137, 1800, 860, 5, 249));
            Colection.Add(new WorkStation(16, 1421, 2295, 1071, 5, 289));
            Colection.Add(new WorkStation(17, 1776, 2926, 1333, 7, 337));
            Colection.Add(new WorkStation(18, 2220, 3731, 1659, 8, 391));
            Colection.Add(new WorkStation(19, 2776, 4757, 2066, 9, 455));
            Colection.Add(new WorkStation(20, 3469, 6065, 2572, 10, 530));
            Colection.Add(new WorkStation(21, 4337, 7733, 3202, 12, 616));
            Colection.Add(new WorkStation(22, 5321, 9860, 3987, 14, 717));
            Colection.Add(new WorkStation(23, 6776, 12571, 4963, 16, 833));
            Colection.Add(new WorkStation(24, 8470, 16028, 6180, 19, 969));
            Colection.Add(new WorkStation(25, 10588, 20436, 7694, 21, 1127));
            Colection.Add(new WorkStation(26, 13235, 26056, 9578, 24, 1311));
            Colection.Add(new WorkStation(27, 16544, 33221, 11925, 29, 1525));
            Colection.Add(new WorkStation(28, 20680, 52357, 14847, 33, 1774));
            Colection.Add(new WorkStation(29, 25849, 54005, 18484, 38, 2064));
            Colection.Add(new WorkStation(30, 32312, 68857, 23013, 43, 2400));
        } 

        public CostModel GetCost(int lvl)
        {
            if (Colection.Count >= lvl)
            {
                return new CostModel(Colection[lvl - 1].woodCost, Colection[lvl - 1].flatfootCost, Colection[lvl - 1].ironCost);
            }
            else
            {
                return null;
            }

        }

        public CostModel GetCost(int startLVL, int lastLVL)
        {
            if (Colection.Count < lastLVL && startLVL > lastLVL)
            {
                return null;
            }
            else
            {
                int wood = 0;
                int flatfoot = 0;
                int iron = 0;

                for (int i = startLVL + 1;i <= lastLVL;i++)
                {
                    wood = wood + Colection[i - 1].woodCost;
                    flatfoot = flatfoot + Colection[i - 1].flatfootCost;
                    iron = iron + Colection[i - 1].ironCost;
                }
                return new CostModel(wood, flatfoot, iron);
            }
        }

        public int Getextraction(int lvl)
        {
            if (Colection.Count >= lvl)
            {
                return Colection[lvl - 1].extraction;
            }
            else
            {
                return 0;
            }
        }
        public int Getextraction(int startLVL, int lastLVL)
        {
            if (Colection.Count < lastLVL && startLVL > lastLVL)
            {
                return 0;
            }
            else
            {
                return Colection[lastLVL - 1].extraction - Colection[startLVL - 1].extraction;
            }
        }
    }
0

Możesz to łatwo osiągnąć dzięki delegacji - wzorzec Strategia - twój liczący algorytm wyrzuć do innej klasy dziedziczącej po IMillCalculate,

public class IMillCalculate
    {
        CostModel GetCost(int lvl);

        CostModel GetCost(int startLVL, int lastLVL);

        int Getextraction(int lvl);

        int Getextraction(int startLVL, int lastLVL);
    } 

A twoją fabrykę

    public class LumberMillColection
    {
        private IMillCalculate strategyCalculate;

        public LumberMillColection(IMillCalculate calculateStrategy)
        {
            strategyCalculate = calculateStrategy;
        }

        private List<WorkStation> Colection = new List<WorkStation>();



        public CostModel GetCost(int lvl)
        {
            strategyCalculate.GetCost(lvl);
        }

        public CostModel GetCost(int startLVL, int lastLVL)
    } 

przez co, gdy będziesz chciał inaczej liczyć utworzysz nowy obiekt tej klasy z innym sposobem liczenia.

0

dobrze nie ma tematu
base. - już wiem jak z tego skorzystać tak żeby działało.

problem miałem ponieważ listę miałem ustawioną na prywatną i jej nie widziałem. Wiem jak to obejść.

temat do zamknięcia

0
  private List<WorkStation> Colection = new List<WorkStation>();
 
        private void Adding()
        {
            Colection.Add(new WorkStation(1, 50, 60, 40, 5, 30));
            Colection.Add(new WorkStation(2, 63, 77, 50, 1, 35));
            Colection.Add(new WorkStation(3, 78, 98, 64, 1, 41));
            // CIACH!
        }
private List<WorkStation> Collection = new List<WorkStation>
{
    new WorkStation(1, 50, 60, 40, 5, 30),
    new WorkStation(2, 63, 77, 50, 1, 35),
    new WorkStation(3, 78, 98, 64, 1, 41),
    ...
}

Albo nawet:

class WorkStationList : List<WorkStation>
{
    public void Add(int a, int b, int c, int d, int e, int f)
    {
        Add(new WorkStation(a,b,c,d,e,f));
    }
}

private List<WorkStation> Collection = new WorkStationList
{
    {1, 50, 60, 40, 5, 30}, {2, 63, 77, 50, 1, 35}, {3, 78, 98, 64, 1, 41}, ...
}
0

http://www.marekczuma.pl/2016/07/12/programowanie-obiektowe-czyli-jak-programowac-aby-skutecznie-tworzyc-realny-swiat/
Polecam, starałem się pisać mega przystępnie - programowanie obiektowe totalnie od 0, tak absolutnie;-) Jakby co to służę pomocą, pisz śmiało.

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