Java - abstrakcyjne klasy

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:

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);

}

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ć.

3

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

2

Tak na szybko koncept:

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.

0

A ma ktoś pomysł na 3 ostatnie metody?

0

A o genericach słyszeli?

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;
    }
}
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;
    }
}
1

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

  @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;
    }
0

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

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