Wyświetlanie interfejsów dla obiektów tablicy

Wyświetlanie interfejsów dla obiektów tablicy
MA
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:24
0

Witam, tworzę mini projekt dotyczący pojazdów. Jestem już praktycznie na finiszu aczkolwiek nie mogę wywołać, nie wiem jak, metod dla obiektów w mojej tablicy. Posiadam klase Vehicle, która zawiera podklase Car oraz Bicycle. Po utworzeniu tablicy, chciałbym wyświetlić interfejs dotyczący ilości kół(jeżeli jest to samochód, ma wyskoczyc że ma 4 koła, jak rower to 2), oraz metodę void fuel, która wyświetla zuzycie paliwa, tylko i wyłącznie jeżeli jest to obiekt dotyczący samochodu. Oto mój kod.

Klasa vehicle:

Kopiuj

    public abstract class Vehicle implements HasWheels
    {
        String brand;
        int weigth;
        int price;

        public Vehicle(String brand, int weight, int price)
        {
            this.brand = brand;
            this.weigth = weight;
            this.price = price;
        }
        
        
        
		public String getBrand() {
			return brand;
		}
		public void setBrand(String brand) {
			this.brand = brand;
		}
		public int getWeigth() {
			return weigth;
		}
		public void setWeigth(int weigth) {
			this.weigth = weigth;
		}
		public int getPrice() {
			return price;
		}
		public void setPrice(int price) {
			this.price = price;
		}

		
		
		public String toString() {
			return "Vehicle brand=" + brand + ", weigth=" + weigth + ", price=" + price + "";
		}    
		
		 public int CompareTo(Vehicle other)//porowywanie cen
	        {
	            if (this.price < other.price) return -1;
	            if (this.price == other.price) return 0;
	            else
	            	return 1;
	        }
		 
		 public boolean isBrandEqual(Vehicle x, Vehicle y)//porownywanie marki
	        {
	            if (x.brand == y.brand) return true;
	            else
	            return false;
	        }
    }

Klasa Car:

Kopiuj

import java.lang.System;


public class Car extends Vehicle implements UseFuel, HasWheels {
double fuelConsumption;
double maxSpeed;
String fuelType;

public Car(String brand, int weight, int price, String fuelType,  double fuelConsumption, double maxSpeed){
	super(brand,weight,price);
	fuelConsumption = 8.5;
	fuelType = "Petrol";
	maxSpeed = 210;
}
public double getFuelConsumption() {
	return fuelConsumption;
}
public void setFuelConsumption(double fuelConsumption) {
	this.fuelConsumption = fuelConsumption;
}
public String getFuelType() {
	return fuelType;
}
public void setFuelType(String fuelType) {
	this.fuelType = fuelType;
}
public double getMaxSpeed() {
	return maxSpeed;
}
public void setMaxSpeed(double maxSpeed) {
	this.maxSpeed = maxSpeed;
}


public String toString() {
	return "Car brand=" + brand + ", weigth=" + weigth + ", price=" + price + ", fuelConsumption=" + fuelConsumption + ", fuelType=" + fuelType + ", maxSpeed=" + maxSpeed + "]";
}

public void fuel(){
	System.out.println("Type of fuel: " + fuelType);
	System.out.println("Fuel Consumption(per100km): " + fuelConsumption);
}

public int wheels() {
	return 4;
}


}

Klasa Bicycle:

Kopiuj
public class Bicycle extends Vehicle implements HasWheels{
String kind;

public Bicycle(String brand, int weight, int price, String kind){
	super(brand,weight,price);
	kind = "city";
}

public String getKind() {
	return kind;
}

public void setKind(String kind) {
	this.kind = kind;
}


public String toString() {
	return "Bicycle brand=" + brand + ", weigth=" + weigth + ", price=" + price + ", kind=" + kind +"";
}

public int wheels() {
	return 2;
}

}

Interface HasWheels:

Kopiuj


public interface HasWheels {

	public int wheels();
}

Interface UseFuel:

Kopiuj

public interface UseFuel {

	public void fuel();
}

Oraz main:

Kopiuj
import java.util.*;
public class Program {

	public static void main(String[] args) {
		
		
		List<Vehicle> list=new ArrayList<Vehicle>();
		list.add(new Car("Infinity", 1700, 170000, "Petrol", 7.3, 245));
		list.add(new Car("Infinity", 1850, 220000, "Petrol", 9.1, 271));
		list.add(new Bicycle("Cube", 10, 8000, "Mountain"));
		list.add(new Bicycle("Romet", 15, 3500, "Road"));
		
		for(Vehicle e:list)
			  System.out.println(e);

/*for( Vehicle e: list){
			 e.print();
			 System.out.println("Liczba kół="+e.hasWheels());
			 if(e instanceof Car)
			  System.out.println("Informacja o paliwie"+ ((Car)e).useFuel());*/ // nie działa
		 }
	}

}

Czy jest ktoś w stanie mi pomóc to napisać?

Pieter24
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:90
1

Nie za bardzo wiem o co pytasz?? Widzę, że stworzyłeś sobie te interfejsy, o których mówisz, zrobiłeś ich implementację więc niby wszystko jest, trochę bałagan ale jest. Skoro chcesz się bawić w klasy abstrakcyjne i już taką stworzyłeś i każda następna ją rozszerza to równie dobrze możesz w tej klasie abstrakcyjnej stworzyć metodę abstrakcyjną getWheels, która to musiałaby być nadpisywana przez każdą następną. Dalej skoro klasa główna (Vehicle), po której dziedziczą wszystkie inne już implementuje interfejs HasWheels (tu zdecyduj co chcesz mieć bo albo interfejs z metodą albo klasa abstrakcyjna z metoda abstrakcyjną) to klasy, które ją dziedziczą też go już mają więc nie ma sensu by klasy car, bike też dodatkowo go implementowały. Masz metody toString wygenerowaną bez tego Twojego pola wheels więc może o to Ci chodzi ?? Daj więcej szczegółów co chcesz uzyskać bo chwilowo napisałeś, że chcesz coś uzyskać a niby już to uzyskujesz to postaramy się pomóc.
To jeszcze jeden edit :D
Doczytaj sobie o interfejsach bo określenie "wyświetlić interfejs" jest mało profesjonalne. Interfejs mówi Ci tylko, że dana klasa implementująca go powinna posiadać daną metodę ale implementację tej metody trzeba wykonać w danej klasie więc widzisz, że to Twoje określenie nie ma zbyt sensu :P

edytowany 2x, ostatnio: Pieter24
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Stacktrace
  • Postów:6821
1

Podpowiem, że jest coś takiego jak wzorzec odwiedzającego(ang. visitor pattern) i to jest doskonały przykład gdzie można go użyć.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
MA
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:24
0
Pieter24 napisał(a):

Nie za bardzo wiem o co pytasz?? Widzę, że stworzyłeś sobie te interfejsy, o których mówisz, zrobiłeś ich implementację więc niby wszystko jest, trochę bałagan ale jest. Skoro chcesz się bawić w klasy abstrakcyjne i już taką stworzyłeś i każda następna ją rozszerza to równie dobrze możesz w tej klasie abstrakcyjnej stworzyć metodę abstrakcyjną getWheels, która to musiałaby być nadpisywana przez każdą następną. Dalej skoro klasa główna (Vehicle), po której dziedziczą wszystkie inne już implementuje interfejs HasWheels (tu zdecyduj co chcesz mieć bo albo interfejs z metodą albo klasa abstrakcyjna z metoda abstrakcyjną) to klasy, które ją dziedziczą też go już mają więc nie ma sensu by klasy car, bike też dodatkowo go implementowały. Masz metody toString wygenerowaną bez tego Twojego pola wheels więc może o to Ci chodzi ?? Daj więcej szczegółów co chcesz uzyskać bo chwilowo napisałeś, że chcesz coś uzyskać a niby już to uzyskujesz to postaramy się pomóc.
To jeszcze jeden edit :D
Doczytaj sobie o interfejsach bo określenie "wyświetlić interfejs" jest mało profesjonalne. Interfejs mówi Ci tylko, że dana klasa implementująca go powinna posiadać daną metodę ale implementację tej metody trzeba wykonać w danej klasie więc widzisz, że to Twoje określenie nie ma zbyt sensu :P

Dzięki wielkie za odpowiedź. Niestety jest to mój pierwszy "projekt" więc sie trochę zgubiłem. Co do implementacji, to juz pousuwałem z Car i Bike wszystko, skoro uzyskują wszystko od klasy Vehicle. Już tłumaczę o co mi dokładnie chodzi.

W mainie stworzyłem 4 obiekty, 2 samochody i 2 rowery. Teraz następnie je wyświetliłem i wszystko do tej pory jest okej. Teraz, chciałbym użyć stworzonych już rzeczy aby tylko i wyłącznie wyświetlić dodatkowe 2 rzeczy(HasWheels, oraz jeżeli jest to samochód-UseFuel) ale po prostu nie wiem jak, bo mi wyskakują z tego błędy i nie wiem co mam aktualnie pozmieniać, abym takie rzeczy mógł wyświetlić.

Masz metody toString wygenerowaną bez tego Twojego pola wheels więc może o to Ci chodzi ?? Daj więcej szczegółów co chcesz uzyskać bo chwilowo napisałeś, że chcesz coś uzyskać a niby już to uzyskujesz to postaramy się pomóc.

no tak jakby dokładnie o to mi chodzi, chce wyświetlić tą informacje, ale poprzez użycie dodatkowej linijki kodu(a nie wiem jak ją stworzyć), aby wyświetlało tylko ilość kół, a nie całość(rower, cene etc.

EDIT:

Tutaj mam polecenie co chce zrobić w jezyku ang.

D. Create ArrayList of references to Vehicle and add to it objects of two subclasses. Display the list of objects and call the method numWheels() for each object. For objects of class Car call method fuel ().

To co pogrubione zostało już zrobione

EDIT2: Masz racje, nie ma co robić sobie problemów z dopisywaniem kolejnych linijek, dodałem do funkcji String opcje wheels() i mi wyświetla. To teraz tylko chciałbym wyświetlić funkcje UseFuel ale tylko i wyłącznie dla samochodów. Jak to zrobić?

edytowany 3x, ostatnio: Markosss
Pieter24
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:90
1

Aha, już chyba rozumiem. To teraz tak, w klasie Car masz konstruktor:

Kopiuj
public Car(String brand, int weight, int price, String fuelType,  double fuelConsumption, double maxSpeed){
    super(brand,weight,price);
    fuelConsumption = 8.5;
    fuelType = "Petrol";
    maxSpeed = 210;
}

a w nim na stałe ustalasz pewne wartości, które to w main starasz się przekazać jako charakterystyczne dla danego obiektu. Zmień go na:

Kopiuj
public Car(String brand, int weight, int price, String fuelType,  double fuelConsumption, double maxSpeed){
    super(brand,weight,price);
    this.fuelConsumption = fuelConsumption;
  this.fuelType = fuelType;
    this.maxSpeed = maxSpeed;
}

słowko this. przed nazwą mówi, że pole to odnosi się do pola danej klasy (bardzo upraszczając tłumaczenie).
Dalej zmieniłem sobie Twój interfejs aby zwracał Stringa:

Kopiuj
public interface UseFuel {
	 public String fuel();
}

i jego implementację w Car zrobiłem następującą:

Kopiuj
public String  fuel(){
    return "Type of fuel: " + getFuelType()  + "Fuel Consumption(per100km): " + getFuelConsumption(); //Pamiętaj, że do pól powinieneś odnosić się za pomocą getterow/setterow 
}

Metodę numWheels() pewnie sobie zrobiłeś sam bez problemu. W metodzie toString() pobierz sobie ilości kół np:

Kopiuj
public String toString() {
	return "Car [fuelConsumption=" + fuelConsumption + ", maxSpeed=" + maxSpeed + ", fuelType=" + fuelType
			+ ", wheels()=" + numWheels() + "]";
}

a for a main już napisałeś sobie i wygląda on mniej więcej tak:

Kopiuj
	for( Vehicle e: list){    
	             System.out.println(e);
	             if(e instanceof Car){
	            	 System.out.println(((Car) e).fuel());
	             }
	             System.out.println("*****");
	}

A i popraw sobie też konstruktor w klasie Bike. Ostatnia sprawa, jak chcesz wyjść od klasy ogólnej (Vehicle) do bardziej szczegółowych to do ogólnej wyrzucasz wszystko co jest wspólne dla pozostałych klas. Czyli równie dobrze w ogólnej mogłeś zrobić pole wheeles i gettery/settery (bez bawienia się w interfejs) a interfejs zastosować jedynie dla metody fuel()

MA
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:24
0

Dobra dziękuje bardzo za wskazówki, już wszystko poprawiłem, klase Bike również i wszystko działa jak należy! Teraz zabieram się za zrobienie sortowania alfabetycznego, jeżeli będę miał z tym jakiś problem to się tutaj odezwę. Jeszcze raz wielkie dzięki za pomoc! Wszystko działa tak jak powinno.

MA
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:24
0

No i na końcówce programu znowu stanąłem, zanim posortuje alfabetycznie to chce porównać dwie ceny w mainie no i wyświetlić wynik.

Więc aby porównać, muszę zaimplementować w klasie Vehicle Comparable<Vehicle>, tak?, następnie tworzę własną metodę która będzie odpowiedzialna za porównanie(zrobiłem to już wcześniej, chyba)

Kopiuj
public int CompareTo(Vehicle other)//porowywanie cen
	        {
	            if (this.price < other.price) return -1;
	            if (this.price == other.price) return 0;
	            else
	            	return 1;
	        }

i jak mam tego użyć w mainie aby porównać np pierwsze dwa obiekty w tablicy?

Z tego wszystkiego wynika mi to, że najtrudniej to jest użyć, a nie napisać..;)

Pieter24
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:90
1

Możesz to zrobić na wiele sposobów, jednym z nich jest właśnie implementacja interfejsu comparable , tu masz przykład http://beginnersbook.com/2013/12/java-arraylist-of-object-sort-example-comparable-and-comparator/
Jeżeli jednak korzystasz z javy 8 to tam masz coś takiego jak lambdy (doczytaj sobie bo to wiele upraszcza) i samo sortowanie możesz zrealizować za pomocą metody sort z Collection i z użyciem właśnie lambdy by skrócić zapis. Wygląda to mniej więcej tak:

Kopiuj
list.sort((a,b) -> a.getPrice()-b.getPrice());

Gdzie list to nazwa twojej listy obiektów i zostaną one posortowane od ceny najniższej do najwyższej

edytowany 1x, ostatnio: Pieter24
MA
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:24
0

Sortowanie już zrobiłem dosyć wcześniej za pomocą tego co napisałeś, kod wygląda praktycznie idetycznie(zrobiłem drobną poprawkę), ale mi chodzi o samo porównanie, a nie sortowanie.

W sensie że mam dwa obiekty w tablicy

Kopiuj
list.add(new Car("Infinity", 1700, **170000**, "Petrol", 7.3, 245));
		list.add(new Car("Infinity", 1850,** 220000**, "Petrol", 9.1, 271));

I już nie chodzi o sortowanie, a o porównanie. Jak mogę teraz porównać te dwa obiekty ze sobą za pomocą ceny. Według mojego kodu

Kopiuj
public int CompareTo(Vehicle other)//porowywanie cen
	        {
	            if (this.price < other.price) return -1;
	            if (this.price == other.price) return 0;
	            else
	            	return 1;
	        }

jeżeli porównam oba samochody, konsola powinna mi zwrócić -1, bo obiekt drugi ma cene wyższą o 50tysięcy.

Przepraszam za banalne pytania i obiecuje że to już ostatnie..;)

Pieter24
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:90
1

Tak jak mówiłem, poczytaj o lambdach to:

Kopiuj
(a,b) -> a.getPrice()-b.getPrice()

jest równoważne jakbyś w klasie vehicle zaimplementował interfejs Comparable i tam nadpisał metodę compareTo:

Kopiuj
	@Override
		public int compareTo(Vehicle arg0 ) {
			return this.price -arg0.price;
		}

W ten sposób co Ci napisałem porównasz dwa obiekty za pomocą ceny. Metoda compareTo zwraca liczbę całkowitą. Jeśli obiekt dla którego wywołujemy metodę ma wartość mniejszą od tego podanego w parametrze zwracana jest wartość mniejsza od 0, jeśli wyższą to większa od 0, natomiast jeśli są równe to zwracane jest 0 i koniec, zero magi oczywiście pod warunkiem, że mówiąc "porównać" masz na myśli, który obiekt ma wyższą/niższa cenę.

MA
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:24
0

Super ;) Wszystko działa, super wyjaśnione. Dziękuje Ci bardzo za pomoc, skończyłem już cały mój projekcik. Pozdrawiam serdecznie.

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)