by Anonymous » 05 Mar 2025, 13:54
Stellen Sie sich zwei Klassen vor, Katze und Hund, die genau das gleiche toString () Implementierung:
teilen
Code: Select all
interface Animal {
String getName();
}
class Cat implements Animal {
private final String name;
public Cat(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public String toString() {
return "I'm a " + this.getClass().getSimpleName() + " named " + this.getName() + ".";
}
}
class Dog implements Animal {
private final String name;
public Dog(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public String toString() {
return "I'm a " + this.getClass().getSimpleName() + " named " + this.getName() + ".";
}
}
Es wäre schön, wenn die gemeinsame Methode toString () an die Schnittstelle gezogen werden könnte:
Code: Select all
interface Animal {
String getName();
// Following code is unfortunately invalid
@Override
default String toString() {
return "I'm a " + this.getClass().getSimpleName() + " named " + this.getName() + ".";
}
}
< /code>
Aber leider erlaubt die Sprache nicht, dass Schnittstellen eine Standardimplementierung einer überschriebenen Methode haben. Ich kann eine abstrakte AbstractAnimal
eine abstrakte Klasse erstellen und sie stattdessen einsetzen, aber sobald meine Katze und Hunde AbstractAnimal erweitern, können sie keine andere Klasse erweitern, was eine unerwünschte Einschränkung darstellt. Abstractanimal hat keinen Zustand, warum kann es also keine Schnittstelle sein? Kann ich andere Möglichkeiten vermeiden, den ToString Code in CAT und Hunde ?
Stellen Sie sich zwei Klassen vor, Katze und Hund, die genau das gleiche toString () Implementierung:
teilen[code]interface Animal {
String getName();
}
class Cat implements Animal {
private final String name;
public Cat(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public String toString() {
return "I'm a " + this.getClass().getSimpleName() + " named " + this.getName() + ".";
}
}
class Dog implements Animal {
private final String name;
public Dog(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public String toString() {
return "I'm a " + this.getClass().getSimpleName() + " named " + this.getName() + ".";
}
}
[/code]
Es wäre schön, wenn die gemeinsame Methode toString () an die Schnittstelle gezogen werden könnte:
[code]interface Animal {
String getName();
// Following code is unfortunately invalid
@Override
default String toString() {
return "I'm a " + this.getClass().getSimpleName() + " named " + this.getName() + ".";
}
}
< /code>
Aber leider erlaubt die Sprache nicht, dass Schnittstellen eine Standardimplementierung einer überschriebenen Methode haben. Ich kann eine abstrakte AbstractAnimal [/code] eine abstrakte Klasse erstellen und sie stattdessen einsetzen, aber sobald meine Katze und Hunde AbstractAnimal erweitern, können sie keine andere Klasse erweitern, was eine unerwünschte Einschränkung darstellt. Abstractanimal hat keinen Zustand, warum kann es also keine Schnittstelle sein? Kann ich andere Möglichkeiten vermeiden, den ToString Code in CAT und Hunde ?