переопределение toString в иерахии классов Java

194
15 февраля 2018, 14:52

в абстрактном классе:

public String toString() {
        return "distance = " + String.format("%.3f", way) +
                " moving speed = " + String.format("%.3f", SPEED) 
    }

в потомке от абстрактного:

public String toString() {
                return "RideOnLine: " + super.toString();
    }

в потомке от потомка:

public String toString() {
                return "RideOnCurve: " + super.toString();
    }

в итоге вывод: RideOnCurve: RideOnLine: distance = 60,000 moving speed = 60,000. Подскажите как грамотно сделать, чтобы не было строки(курсивом) от потомка абстрактного?

Answer 1

Сама суть переопределения методов в том, чтобы все дети класса-родителя, переопределившего какой-либо метод, видели у себя "новую" версию метода.

Вы же хотите иметь возможность получить "чистый" результат метода toString() абстрактного класса у всех потомков по иерархии. Для этого вынесите этот метод отдельно (при необходимости - в финальный) и используйте в потомках его. Пример реализации:

abstract class AbstractClass {
    private float way = 60000;
    private float SPEED = 60000;
    @Override
    public String toString() {
        return formatData();
    }
    protected final String formatData() {
        return String.format("distance = %.3f moving speed = %.3f", way, SPEED);
    }
}
class Parent extends AbstractClass {
    @Override
    public String toString() {
        return "RideOnLine: " + formatData();
    }
}
class Child extends Parent {
    @Override
    public String toString() {
        return "RideOnCurve: " + formatData();
    }
}
Answer 2
class Abstract {
  protected String getInfo() {
    return "distance = " + String.format("%.3f", way) +
            " moving speed = " + String.format("%.3f", SPEED);
  }
  @Override
  public String toString() {
    return getInfo(); 
  }
}
class Child1 extends Abstract {
  @Override
  public String toString() {
    return "RideOnLine: " + getInfo();
  }
}
class Child2 extends Child1 {
  @Override
  public String toString() {
    return "RideOnCurve: " + super.toString();
  }
}

Или

class Abstract {
  @Override
  public String toString() {
    return "distance = " + String.format("%.3f", way) +
            " moving speed = " + String.format("%.3f", SPEED);
  }
}
class Child1 extends Abstract {
  protected String getPrefix() {
    return "RideOnLine: ";
  }
  @Override
  public String toString() {
    return getPrefix() + super.toString();
  }
}
class Child2 extends Child1 {
  @Override
  protected String getPrefix() {
    return "RideOnCurve: ";
  }
}
READ ALSO
Замаппить объекты в Java JPA

Замаппить объекты в Java JPA

Имеется следующая структура БД PostgreSQL:

207
Проверки электронной подписи ЕСИА openId

Проверки электронной подписи ЕСИА openId

Добрый день! Пишу интеграцию с есиа по opendid connect на javaНазрел вопрос по проверки подписи маркера доступа/идентификации

232
Как получить дату изменения каталога в Java

Как получить дату изменения каталога в Java

Как в Java получить FolderlastModified()? Вариант рекурсивного просмотра каталога в глубину и взятие даты последнего файла не подходит, так как каталог...

207