Modyfikacja konstruktora w podklasie

Modyfikacja konstruktora w podklasie
ML
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:17
0

Cześć, mam kilka pytań, będę wdzięczny za pomoc

Mam 3 klasy (usunąłem nieistotne dla postu metody i zmienne)

Kopiuj
abstract class Employee {

	private String name;				//
	private double baseSalary;			//

	public Employee(String name, double baseSalary) {
		this.name = name;				// 
		this.baseSalary = baseSalary;	// 
	}

  	public double getBaseSalary() {
		return baseSalary;				//
  	}

}

abstract class TechnicalEmployee extends Employee {
	public TechnicalEmployee(String name) {
		super(name, 75000);			//
	}
}

class TechnicalLead extends TechnicalEmployee {
	public TechnicalLead(String name) {
		???????						//
	}
}

Linie bez znaku komentarza nie mogą być zmienione (poza modyfikatorami klas), muszę użyć tych klas i metod, bez zmiany ich parametrów.

Moje pytania:

  1. Zakładam, że dobrze zrobiłem nadając klasy abstrakcyjne, jeśli instancjami będą jedynie TechnicalLead?
  2. Zakładam też, zmienne w Employee powinny być private?
  3. TechnicalEmployee musi mieć baseSalary 75000. Zakładam, że mój konstruktor jest ok?
  4. TechnicalLead musi mieć 1.3 * baseSalary TechnicalEmployee. Tu mam problem, nie wiem jak to ugryźć.
edytowany 4x, ostatnio: Shalom
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:minuta
  • Lokalizacja:Laska, z Polski
  • Postów:10058
1

Wszystkie Twoje założenia są dobre.

Ja zakładamy że technical lead musi dziedziczyć z technical employee?

Bo jeśli tak, to w Twoim przykładzie technical employee (czyli również technical lead) musi mieć salary jednocześnie 7300 oraz 7300*1.3. Co jest oczywiście nie możliwe. Bo patrz, mówisz że technical employee ma mieć 7300, a technical lead który jest technical employee (więc ma 7300) ma mieć więcej.

Rozumiem, że to znaczy że każdy technical employee który nie jest technical leadem ma mieć 7300? W takim wypadku to nie technical employee powinien ustawiać cenę w konstruktorze, tylko klasy wyżej (np tech lead, albo inne dziedziczące z tech employee).

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 4 godziny
  • Postów:2368
0

Jaki jest kontekst problemu?

Dostarczenie przykładu z dziedziczeniem na jakieś zajęcia? Czy może realny problem do rozwiązania?

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:minuta
  • Lokalizacja:Laska, z Polski
  • Postów:10058
1

W skrócie, jeśli ma to być parametr konstruktora - to w technical employee musi być przynajmniej jeden konstruktor który ma sallary jako parametr.
Jeśli nie musi to być parametr konstruktora, to możesz zrobić metodę abstrakcyjną getBaseSallary() którą różne klasy będą implementowały w różny sposób.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
4

Mkbewe już wysłany za to private double baseSalary;

MKbewe


jeden i pół terabajta powinno wystarczyć każdemu
ML
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:17
0

Układ klas powinien wyglądać tak:

				 				          Employee

                TechnicalEmployee                                    BusinessEmployee
                baseSalary 75000                                     baseSalary 50000

SoftwareEngineer          TechnicalLead			         BusinessLead		       Accountant
                          1.3 * TechnicalLead        
                          baseSalary                     

Parametry konstruktorów z pierwszego posta nie mogą być zmienione.
Pod nazwami klas umieściłem wymogi dla baseSalary poszczególnych klas.
Nie jest możliwe aby konstruktor TechnicalLead nadpisał konstruktor TechnicalEmployee zwiększając baseSalary?

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:minuta
  • Lokalizacja:Laska, z Polski
  • Postów:10058
1
MichałL napisał(a):

Nie jest możliwe aby konstruktor TechnicalLead nadpisał konstruktor TechnicalEmployee zwiększając baseSalary?

Nope. I bardzo dobrze, bo nie miałoby to sensu.

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:minuta
  • Lokalizacja:Laska, z Polski
  • Postów:10058
2
MichałL napisał(a):

Układ klas powinien wyglądać tak:

  			 				          Employee

                TechnicalEmployee                                    BusinessEmployee
                baseSalary 75000                                     baseSalary 50000

SoftwareEngineer TechnicalLead BusinessLead Accountant
1.3 * TechnicalLead
baseSalary

Ok, kluczowe pytanie - czy rozumiesz, że to nie jest tak że TechnicalLead jest jakoś pod/nad TechnicalEmployee? To znaczy że TechnicalLead jest TechnicalEmployee.
Ten diagram który wkleiłeś wyżej, sugeruje że TechnicalLead ma mieć baseSalary = 75000 oraz baseSalary = 1*3 baseSalary (dwie definicje). Więc w taki sposób na pewno nie da się tego zrobić (trochę jakbyś chciał powiedzieć "jestem 1.3 razy starszy od samego siebie".

Parametry konstruktorów z pierwszego posta nie mogą być zmienione.
Pod nazwami klas umieściłem wymogi dla baseSalary poszczególnych klas.

No to masz jeszcze do wyboru dodać drugie pole salary. Wtedy będziesz miał dwa pola baseSalary oraz salary. I baseSalary = 73000 a salary = baseSalary * 1.3. Tylko to ma taką wadę że żadna logika w Employee albo TechnicalEmployee nie będzie o tym wiedzieć.

Drugie wyjście to nadpisanie metody getBaseSalary(). Ma to sens tylko wtedy jeśli żadne funkcje nie operują na polu baseSalary, a wszystkie korzystają z tego gettera.

Trzecim, najlepszym byłaby edycja konstruktora - ale z jakiegoś tajemniczego powodu, nie można go użyć.

edytowany 2x, ostatnio: Riddle
ML
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:17
0

To jest projekt z kursu Javy na edX. Nie jest powiedziane, że ustawienia baseSalary w podklasach mają być z poziomu konstruktorów. Wydaje mi się, że faktycznie nadpisanie getBaseSalary() w podklasach jest dobrym rozwiązaniem.

Parametry konstruktorów oraz nazwy i parametry metod są podane w treści projektu, dlatego nie mogę ich zmienić. Od siebie mogę umieścić zmienne w miejscach, które uważam za ok oraz nadpisać konstruktory lub metody.

edytowany 1x, ostatnio: MichałL
Riddle
Pod warunkiem że nic nie korzysta i nie będzie korzystać z pola, a wszystko będzie korzystać z gettera. Założenie oczywiście z czapy IMO.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:minuta
  • Lokalizacja:Laska, z Polski
  • Postów:10058
1
MichałL napisał(a):

Od siebie mogę umieścić zmienne w miejscach, które uważam za ok oraz nadpisać konstruktory lub metody.

Nie ma czegoś takiego jak nadpisanie konstruktora.

Najwyżej możesz użyć konstruktora super-klasy w pod-klasie.

edytowany 1x, ostatnio: Riddle
ML
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:17
0

Ok. Postaram się oprzeć wszystko o getBaseSalary(). Dzięki za pomoc.

Diagram jest przeklejony z projektu. Założenia co do baseSalary z opisu klas.

Co jest nie tak z private double baseSalary ?

edytowany 1x, ostatnio: MichałL
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
0

Java to nie moja dziedzina, ale czemu nikt mu nie pisze o interface'ach?
Z tego co wiem to użycie interface'ów jest bardziej elastyczne inż zwykłe dziedziczenie.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Riddle
Powinno się, ale @MichałL mówi że ma pińćset jakichś kryteriów na ten program, który nic nie pozwala zmienić.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
4
MichałL napisał(a):

Co jest nie tak z private double baseSalary ?

Nie trzyma się pieniędzy w liczbach zmiennoprzecinkowych


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
ML
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:17
0
Kamil Żabiński napisał(a):
MichałL napisał(a):

Co jest nie tak z private double baseSalary ?

Nie trzyma się pieniędzy w liczbach zmiennoprzecinkowych

niestety getBaseSalary() ma zwracać double, ale wiem, że przy operacjach na tym typie występują błędy

jarekr000000
Na BigDecimal też występują błędy. Tylko w przypadku pieniedzy można je zrobić zgodnie z prawem.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:minuta
  • Lokalizacja:Laska, z Polski
  • Postów:10058
2
MichałL napisał(a):

niestety getBaseSalary() ma zwracać double, ale wiem, że przy operacjach na tym typie występują błędy

To że getBaseSalary() ma zwracać double, nie znaczy że pole baseSalary ma je przechowywać jako double. Mogłoby np być

Kopiuj
int baseSalary = 120; // 120 groszy

double getBaseSalary() {
  return baseSalary / 100.0;
}

Ale skoro chcesz oprzeć wszystko na tym getterze, to taka zamiana i tak nic nie da.


Powiem wprost, żebyś wiedział. Te założenia, które są Ci narzucane - są bez sensu. Robienie tak aplikacji, moim zdaniem, to uczenie się złych nawyków. Nie robiłbym tego, chyba że nie miałbym innego wyjścia.

edytowany 2x, ostatnio: Riddle
ML
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:17
0
TomRiddle napisał(a):

Powiem wprost, żebyś wiedział. Te założenia, które są Ci narzucane - są bez sensu. Robienie tak aplikacji, moim zdaniem, to uczenie się złych nawyków. Nie robiłbym tego, chyba że nie miałbym innego wyjścia.

Dzięki za sugestię i za pomoc, ten już chyba skończę, ale poważnie rozważę ciągnięcie tego dalej.

ML
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:17
0

Przejrzałem GitHuba i z tego co widzę są stosowane głównie 2 rozwiązania.

Zmienne w Employee jako public, ale rozumiem, że to nie jest dobre rozwiązanie.

Dodatkowy konstruktor w TechnicalEmployee mający za parametry String name i double multiplier. W TechnicalLead jest zmienna multiplier równa 1.3 podawana jako argument przy wywoływaniu konstruktora TechnicalEmployee.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2
MichałL napisał(a):

Przejrzałem GitHuba i z tego co widzę są stosowane głównie 2 rozwiązania.

Zmienne w Employee jako public, ale rozumiem, że to nie jest dobre rozwiązanie.

Kopiuj
public final BigDecimal kosztZupy;

jest o kilka klas lepszy
niż

Kopiuj
private  BigDecimal kosztZupy;

public void setKosztZupy(BigDecimal kosztZupy) {
    kosztZupy = kosztZupy;
}

jeden i pół terabajta powinno wystarczyć każdemu
ML
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad 3 lata
  • Postów:17
0
jarekr000000 napisał(a):

public final BigDecimal kosztZupy;

Kopiuj
jest o kilka klas  lepszy 
niż 

private BigDecimal kosztZupy;

public void setKosztZupy(BigDecimal kosztZupy) {
kosztZupy = kosztZupy;
}

Kopiuj

W rozwiązaniach, na które parzyłem nie było final, ale biorąc pod uwagę, że w zadaniu i tak nie ma metody setBaseSalary() to chyba faktycznie jest dobra opcja. Chyba, że jest coś o czym nie wiem?

Roman Mokrzan
  • Rejestracja:ponad 5 lat
  • Ostatnio:2 miesiące
  • Postów:159
0

Nie wnikałem w meandry waszych rozważań o dziedziczeniu ale widzę podstawowy problem w twoim kodzie.

Nie przejmuj się bo wiele doświadczonych osób o tym też nie wie. Otóż chodzi mi o reprezentację wartości pieniężnych za pomocą doubla co jest błędne. Więcej możesz poczytać tutaj https://stackoverflow.com/q/179427/2401535.


KamilAdam
Spóźniłeś się o jakiś dzień z tą radą :D
Roman Mokrzan
Może... Ale zrobiłem to lepiej bo generycznie.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)