Java - abstrakcyjne klasy

Java - abstrakcyjne klasy
MA
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:72
0

Mam do zrobienia takie zadanie:
Dodaj klasę abstrakcyjną Value, która będzie posiadać następujące metody:
public abstract String toString()
public abstract Value add(Value)
public abstract Value sub(Value)
public abstract Value mul(Value)
public abstract Value div(Value)
public abstract Value pow(Value)
public abstract boolean eq(Value)
public abstract boolean lte(Value)
public abstract boolean gte(Value)
public abstract boolean neq(Value)
public abstract boolean equals(Object other)
public abstract int hashCode()
public abstract Value create(String s) – tworzy konkretny obiekt ze stringa (wartość obiektu jest podana jako string)
zaimplementuj klasy dziedziczące po Value, implementujące konkretne wartości: Integer, Double, Float, String, DateTime.
I szczerze mówiąc nie bardzo wiem, jak to zrobić. Nie wiem, jak zrobić, żeby zwracały i przyjmowały za argument klasę.
Na razie mam coś takiego:

Kopiuj
public abstract class Value {

    public abstract String toString();
    public abstract Value add(Value v);
    public abstract Value sub(Value v);
    public abstract Value eq(Value v);
    public abstract Value lte(Value v);
    public abstract Value gte(Value v);
    public abstract Value neq(Value v);
    public abstract boolean equals(Object other);
    public abstract int hashCode();
    public abstract B create(String s);

}

Kopiuj
public class Integer extends Value {

    int val;

    public Integer(int a){
        this.val=a;
    }
    @Override
    public Value add(Value v) {
        this.val = this.val + v.val;
        return this;
    }
}
}

Wiem, że metoda add w klasie Integer nie jest napisana poprawnie, ale nie mam pojęcia, jak to ma wyglądać.

YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 dni
  • Postów:2370
3

Albo jeszcze nie wstałem, albo jest to głupie zadanie i łamie LSP, bo jak dodać floata do daty...

szarotka
  • Rejestracja:ponad 9 lat
  • Ostatnio:12 dni
  • Postów:533
2

Tak na szybko koncept:

Kopiuj
public class Integer extends Value {
    final int val;

    public Integer(int value) {
        val = value;
    }

    @Override
    public Value add(Value v) {
        int value = 0;
        if (v instanceof Integer) {
            Integer parsedValue = (Integer) v;

            value = this.val + parsedValue.val;
        }
        return new Integer(value);
    }
}

Jak pisał ktoś wyżej dodawanie pewnych typów nie ma sensu, np. daty i Stringa, więc sprawdzasz czy Value jest sensownego typu i jeśli tak to coś z nim robisz.

Zastanawiałam się i w sumie przenoszenie val do Value jest bez sensu, to tylko skomplikuje, z drugiej strony bez sensu dziedziczenie, tutaj lepiej by się nadał interfejs.

edytowany 3x, ostatnio: szarotka
MA
A czy muszę dodać konstruktory do obu klas?
szarotka
Jak widzisz trochę zmieniłam. Dodałam final i konstruktor. W sumie to dopiero jak zobaczyłam mój poprzedni kod to stwierdziłam ze do d**y. Po dodaniu dwóch Integerów zwrócimy nowy obiekt typu Integer (nie bedziemy nadpisywać starego, słówko final mówi nam że ta wartość nie ulegnie zmianie.
MA
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:72
0

A ma ktoś pomysł na 3 ostatnie metody?

Black007
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 godzin
0

A o genericach słyszeli?

Kopiuj
public abstract class Value<T> {
    private T internalValue;

    public abstract Value add(final Value<T> other);

    public T getInternalValue() {
        return internalValue;
    }

    public void setInternalValue(final T internalValue) {
        this.internalValue = internalValue;
    }
}
Kopiuj
public class IntegerValue extends Value<Integer> {
    @Override
    public Value add(Value<Integer> other) {
        Value result = new IntegerValue();
        result.setInternalValue(this.getInternalValue() + other.getInternalValue());
        return result;
    }
}

"Nie popełnia błędów tylko ten, kto nic nie robi"
edytowany 1x, ostatnio: Black007
Black007
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 godzin
1

equals, hashcode:
Przykład z automatu z Intelij:

Kopiuj
  @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Value<?> value = (Value<?>) o;

        return internalValue != null ? internalValue.equals(value.internalValue) : value.internalValue == null;
    }

    @Override
    public int hashCode() {
        return internalValue != null ? internalValue.hashCode() : 0;
    }

"Nie popełnia błędów tylko ten, kto nic nie robi"
edytowany 1x, ostatnio: Black007
MA
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:72
0

Czy np. klasa String musi dziedziczyć wszystkie metody po Value? Chyba bez sensu pisać metodę pow(pierwiastek) dla Stringa.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.