Dziedziczenie klas

0

Witam, mam takie dwie klasy jak ponizej, ale mam w programie wykorzystac dziedziczenie,
wiec powtarzajace sie w obu klasach dwie zmienne "int Czas; double Kwota;" oraz dwie funkcje Jaka_Kwota(); i Jaki_Czas(); chcialbym dac to trzeciej class'y konto i uzyc w pozostalych klasach, czy jest taka mozliwosc, zeby funkcje wewnatrz classy Ror mogly korzystac z zmiennych class'y konto w ktorej beda zaimplementowane???

class Konta
{
private:
int Czas;
double Kwota;
public:
double Jaka_Kwota(void) {
return this->Kwota;
}
int Jaki_Czas(void) {
return this->Czas;
}
};

class Ror // : public Konta
{
          int Czas;
          double Kwota;
   public:
          Ror(double Kwota1, int Czas1)
          {
              this->Czas = Czas;
              this->Kwota = Kwota;
          };
          ~Ror() {};
          double Jaka_Kwota(void) {
              return this->Kwota;
          }
          int Jaki_Czas(void) {
              return this->Czas;
          }
};

class Lokata // : public konta
{
   private:
          TTimer *Zegar;
          int Czas,Licznik,LicznikCzasu;
          double Kwota,Oprocent;
   public:
          void __fastcall ZegarTimer(TObject *Sender)
          {
              Licznik+=1;
              if(LicznikCzasu == Czas) {
                 Zegar->Enabled = false; return;
              }
              if(Licznik == 60) {
                 int Kwot = (Kwota * ((Oprocent/12.0)/100.0));
                 Kwota = Kwota + Kwot;
                 LicznikCzasu++;
                 Licznik = 0;
              }
          }
          Lokata(double Kwota, int Czas)
          {
              this->Oprocent = Oprocentowanie(Czas);
              this->Czas = Czas;
              this->Kwota = Kwota;
              this->Licznik = 0;
              this->LicznikCzasu = 0;
              Zegar = new TTimer(0);
              Zegar ->OnTimer = ZegarTimer ; //  Funkcja Timera
              Zegar ->Interval = 1000 ;  //1000 mili-sek == 1 sek
              Zegar ->Enabled = true;  //   Uruchom timer
          };
          ~Lokata()
          {
             Zegar->Destroying();
          };
          double Jaka_Kwota(void) {
              return this->Kwota;
          }
          int Jaki_Czas(void) {
              return this->Czas;
          }
};
0

No dokladnie, wlasnie ja tak z tego korzystam mam inna klase Osoba (pozniej) w ktorej mam zmienne typu ror i lokata.
A z tym dziedziczeniem to chyba w zla strone idziemy, klasa Konta nie ma co dziedziczyc klas Ror i Lokata bo sie to zamiesza bo kazda z nich ma swoje funkcje odpowiadajace za poszczegolne naliczanie oprocentowania :/ Trzeba wymyslec tak klase Konta zeby ja dziedziczyly Ror i Lokata na przyklad jak w pierwszym poscie napisalem powtarzajace sie dwie zmienne czy funkcje, jesli jest to do wykonania.

class Osoba
{
Ror *Konta_Ror[32];
Lokata *Konta_Lokaty[32];
....
}

potrzeba Klasy ktorą będą dziedziczyc klasy Ror i Lokata, cos wymyslec zeby nauczyciel sie odczepil :)

0

Zupełnie nie wiem dlaczego mój post jako nn zniknął.
Ale nie ważne.
Jeśli Ror ma dziedziczyć Konto to:

class Ror: public Konto{
...
}

Jak w klasie Ror chcemy użyć funkcji z Konto a nie Ror
to piszemy Konto::Jaka_Kwota() i zwróci wartość Kwota z klasy Konto.
A Konto::Kwota jest zmienną z klasy Konto do użycia w klasie Ror.
Tylko żeby to miało sens w konstruktorze Ror powinniśmy zaincjować wartośc z klasy Konto np.

Ror(double Kwota1, int Czas1)
          {
              this->Czas = Czas1;
              this->Kwota = Kwota1;
              Konto::Kwota=Kwota1+6;
             //.......
          };

Acha masz bląd Czas,Czas1 w konstruktorze

//q: post wywalilem bo zawarty w nim przykladowy kod byl bez sensu. Konto dziedziczace po Ror i Lokata? no bez kpin.. gdzie sens?
quetzalcoatl - i dobrze zrobiłeś bo nie bardzo zrozumiałem o co chodzi Czakolowi

0

dziala

0

Wyglada na to ze kod ponizej jest dobry, jagby ktos potrzebowal prosze sie poczestowac :)
Ale mam takie pytanie,

Form1->ListBox3->Items->Add("Kwota: "+AnsiString(Lista_Ror[i]->Konta::Jaka_Kwota())+"  |  Miesiące: "+AnsiString(Lista_Ror[i]->Konta::Jaki_Czas())); 

I dostaje wypisane cos takiego "Kwota: 104 | Miesiace: 3" a powinno byc "Kwota: 104,234252 | Miesiace: 3" ponizej macie kod, spojrzcie dlaczego tak jest?

// -- definicje class
class Konta
{
public:
          int Czas;
          double Kwota;
          double Jaka_Kwota(void) {
              return this->Kwota;
          }
          int Jaki_Czas(void) {
              return this->Czas;
          }
};

/* wyglada na to ze w koncie Ror nie naliczane sa odsetki
   to konto ma ulatwic osobie pobieranie i odbieranie pieniedzy
   dba o to ze wyplata wplywa na konto w ktorym mozna przechowywac pieniadze
   placic karta badz wyplacac je w bankomacie
   ma to nam oszczedzic sytuacji takich jagbysmy zgubili pieniadze czy zostali okradnieci */
class Ror : public Konta
{
   public:
          Ror(double Kwota1, int Czas1)
          {
              Konta::Czas = Czas1;
              Konta::Kwota = Kwota1;
          };
          ~Ror() {};
};

/* Lokata terminowa jest to umowa między bankiem a klientem dotycząca lokowania środków pieniężnych
   zawierana na czas określony. Bank zobowiązuje się wypłacić kapitał wraz z odsetkami na koniec okresu umowy. */
class Lokata : public Konta
{
   private:
          TTimer *Zegar;
          int Licznik,LicznikCzasu; // int Czas;
          double Oprocent; // double Kwota;
   public:
          void __fastcall ZegarTimer(TObject *Sender)
          {
              this->Licznik++; // zwiekszamy Licznik czyli liczymy dni
              if(LicznikCzasu == Konta::Czas) {
                 this->Zegar->Enabled = false; return;
              }
              if(Licznik == 60) {
                 int Kwot = (Konta::Kwota * ((this->Oprocent/12.0)/100.0));
                 Konta::Kwota = Konta::Kwota + Kwot;
                 this->LicznikCzasu++; // Liczba miesiecy
                 this->Licznik = 0; // zerujemy licznik dni zeby ponownie je liczyc
              }
          }
          Lokata(double Kwota1, int Czas1)
          {
              this->Oprocent = Oprocentowanie(Czas1);
              Konta::Czas = Czas1;
              Konta::Kwota = Kwota1;
              this->Licznik = 0;
              this->LicznikCzasu = 0;
              this->Zegar = new TTimer(0);
              this->Zegar ->OnTimer = ZegarTimer ; //  Funkcja Timera
              this->Zegar ->Interval = 1000 ;  //1000 mili-sek == 1 sek
              this->Zegar ->Enabled = true;  //   Uruchom timer
          };
          ~Lokata()
          {
             this->Zegar->Destroying();
          };
};

class Osoba
{
   private:
          int NumElemnt;
          double Pesel;
          AnsiString Imie;
          AnsiString Nazwisko;
   public:
          Ror *Lista_Ror[LICZBA_KONT]; // zalozmy ze jedna osoba moze zalozyc wylacznie 8 rachunkow ROR
          Lokata *Lista_Lokat[LICZBA_KONT]; // zalozmy ze jedna osoba moze zalozyc wylacznie 8 lokat
          Osoba(AnsiString imie,AnsiString nazwisko,double pesel,int NumElemnt) // konstruktor klasy wywolywany w momencie tworzenia jej (new Osoba();)
          {
              for(int i=0; i<LICZBA_KONT ;i++) {
                 Lista_Ror[i] = NULL;
                 Lista_Lokat[i] = NULL;
              }
              this->NumElemnt = NumElemnt;
              this->Imie = imie;
              this->Nazwisko = nazwisko;
              this->Pesel = pesel;
          };
          ~Osoba() {};
          bool Sprawdz(double pesel) {
              if(this->Pesel == pesel) return TRUE;
              else return FALSE;
          }
          void Wypisz_informacje(int i) {
               ShowMessage("Osoba w tablicy na miejscu: " + AnsiString((i+1)) + "\nImie: " +
                  this->Imie + "\nNazwisko: " + this->Nazwisko + "\nPesel: " + AnsiString(this->Pesel));
          }
          void Dodaj_Ror(double kwota,int czas)
          {
             for(int i=0; i<8 ;i++)
             {
                if(Lista_Ror[i] == NULL)
                {
                    Lista_Ror[i] = new Ror(kwota,czas);
                    break;
                }
             }
          }
          void Dodaj_Lokata(double kwota,int czas)
          {
             for(int i=0; i<8 ;i++)
             {
                if(Lista_Lokat[i] == NULL)
                {
                    Lista_Lokat[i] = new Lokata(kwota,czas);
                    break;
                }
             }
          }
          void Wyswietl_Konta(void)
          {
              Form1->ListBox2->Clear();
              Form1->ListBox3->Clear();
              for(int i=0; i<8 ;i++)
              {
                 if(Lista_Ror[i] != NULL)
                 {
                    Form1->ListBox2->Items->Add("ROR: "+AnsiString(NumElemnt)+","+AnsiString(i+1));
                    if(Lista_Ror[i]->Konta::Jaka_Kwota() != 0 && Lista_Ror[i]->Konta::Jaki_Czas() != 0)
                      Form1->ListBox3->Items->Add("Kwota: "+AnsiString(Lista_Ror[i]->Konta::Jaka_Kwota())+"  |  Miesiące: "+AnsiString(Lista_Ror[i]->Konta::Jaki_Czas()));
                 }
              }
              for(int i=0; i<8 ;i++)
              {
                 if(Lista_Lokat[i] != NULL) {
                    Form1->ListBox2->Items->Add("Lokata: "+AnsiString(NumElemnt)+","+AnsiString(i+1));
                    if(Lista_Lokat[i]->Konta::Jaka_Kwota() != 0 && Lista_Lokat[i]->Konta::Jaki_Czas() != 0)
                      Form1->ListBox3->Items->Add("Kwota: "+AnsiString(Lista_Lokat[i]->Konta::Jaka_Kwota())+"  |  Miesiące: "+AnsiString(Lista_Lokat[i]->Konta::Jaki_Czas()));
                 }
              }
          }
};
Osoba *Lista_osob[LICZBA_OSOB];

bo tutaj ponizej wszystko sie dobrze wyswietla

double A=100.00012314;
ShowMessage(AnsiString(A));
0

Spróbuj tak:

Form1->ListBox3->Items->Add(Ansistring().sprintf("Kwota: %f | Miesiące: %i",Lista_Ror[i]->Jaka_Kwota(),Lista_Ror[i]->Jaki_Czas())); 
0

Panie Tadeuszu, jest Pan genialny. Wiedział Pan o co chodzi Czakolowi, choć On sam nie bardzo wiedział.

0

...

0

Czakol - to nie do Ciebie. Tylko złośliwy komentarz do moderatora. (za wywalenie mojego postu i niegrzeczne uwagi typu "bez sensu", bez uzasadnienia).
Cieszę się że problem masz "z głowy".

0

uzasadnienie mozna znalezc w kazdym tutorialu/podreczniku OOP:

dziedziczenie jest po to, aby uszczegolawiac, nie aby rozbudowywac i zlepiac. od tego jest agregacja. zwykle rozumienie pojec 'ror', 'lokata' i 'konto' podpowiada ze ror JEST kontem i Lokata JEST kontem i to juz wskazuje kierunek dziedziczenia..

stad, moje uzasadnienie zostalo skrocone do: "Konto dziedziczace po Ror i Lokata? no bez kpin.. gdzie sens?"

rzeczywiscie, z "no bez kpin" przegialem i za nie przepraszam -- zostawiam je jako 'dowod w sprawie'. okreslenie "bez sensu" bylo na miejscu. usuniecie Twojego postu - bylo rowniez, poniewaz kierowal on totalnie na manowce, w czym zreszta mi przyznales racje dopisujac pozniej "quetzalcoatl - i dobrze zrobiłeś bo nie bardzo zrozumiałem o co chodzi Czakolowi".

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