Interface oder Vererbung?

Mariexshhx

Bekanntes Mitglied
Hey, meine Aufgabe ist es die Typenunterscheidung aus der Klasse zu entfernen. Ich habe für die einzelnen Typen (also Spielfiguren) schon Klassen erstellt und die Methode act für den jeweiligen Spieler entsprechenden überschriebenben. Nun ist die Methode act aber "leer". Was mache ich mit dieser Methode. Gleiches gilt für die Methoden isLivingBug etc. die wurden auch alle in den verschiedenen Klassen für die Spielertypen überschrieben und hätten jetzt quasi keine Implemetierung. Ich habe jetzt erstmal immer false zurückgeben lassen. Das klingt halt alles nach Interface, aber die Methoden, wie sich die Spieler bewegen sind ja für alle Arten gleich, deswegen passt kein Interface. Achso, natürlich habe ich meine einzelnen Spielerklassen alle von Unit erben lassen. Jemand eine Idee, was ich jetzt mit den Methoden machen kann? Abstrakt können sie ja auch nicht sein....
 

Anhänge

  • Unit.java
    2,6 KB · Aufrufe: 0

temi

Top Contributor
Irgendwie kommt mir die Frage bekannt vor, ohne jetzt den Code angeschaut zu haben. Ich lade i.d.R. nichts herunter, insofern wäre es besser die Code-Tags zu verwenden.
 

Mariexshhx

Bekanntes Mitglied
Java:
ublic class Unit {

  private final GamePanel game;
  private int row;
  private int col;
  private UnitType type;

  protected int hitpoints;
  protected int strength;

  public Unit(GamePanel game, int row, int col,UnitType type) {
    this.game = game;
    this.type=type;
    this.row = row;
    this.col = col;



  }

  public void placeUnit(int row, int col) {
    if (game.occupied(row, col)) return;
    game.removeUnit(this.row, this.col);
    game.placeUnit( row, col,type);
    this.row = row;
    this.col = col;
  }

  public int getRow() {
    return row;
  }

  public int getCol() {
    return col;
  }

  public boolean isStationary() {
    return false;
  }

  public boolean isLivingPlant() {
    return false;
  }

  public boolean isLivingBug() {
    return false;
  }

  public boolean isLivingEnemy() {
    return false;
  }

  public void act(Set<Unit> units) {


  }

  protected void moveRandomly() {
    placeUnit(randomWalk(row), randomWalk(col));
  }

  protected void moveTowards(Unit other) {
    int nextrow = row;
    int nextcol = col;
    if (row < other.row) nextrow++;
    if (row > other.row) nextrow--;
    if (col < other.col) nextcol++;
    if (col > other.col) nextcol--;
    placeUnit(nextrow, nextcol);
  }

  private int randomWalk(int r) {
    if (Math.random() < 0.25) return r - 1;
    if (Math.random() > 0.75) return r + 1;
    return r;
  }


  protected void attack(Unit other) {
    System.out
        .println(this.type + " hits " + other.type + " Remaining Hitpoints: " + other.hitpoints);
    other.hit(strength);
  }

  private void hit(int strength) {
    hitpoints -= strength;
  }

  protected boolean isNeighbor(Unit other, int dist) {
    return Math.abs(row - other.row) <= dist &&
        Math.abs(col - other.col) <= dist;
  }

  protected int distance(Unit me, Unit a, Unit b) {
    var d1 = distance(me, a);
    var d2 = distance(me, b);
    return Double.compare(d1, d2);
  }

  private double distance(Unit me, Unit b) {
    return Math.sqrt(square(me.row - b.row) + square(me.col - b.col));
  }

  private double square(int v) {
    return v * v;
  }

  public boolean isDead() {
    return hitpoints <= 0;
  }

  public boolean isAlive() {
    return hitpoints > 0;
  }
}
 

mihe7

Top Contributor
@temi
Java:
package de.propra.defense;

import static de.propra.defense.UnitType.BUG1;
import static de.propra.defense.UnitType.BUG2;
import static de.propra.defense.UnitType.CROW;
import static de.propra.defense.UnitType.FROG;
import static de.propra.defense.UnitType.PLANT;
import static de.propra.defense.UnitType.SCARECROW;


import de.propra.defense.ui.GamePanel;
import java.util.Optional;
import java.util.Set;

public class Unit {

  private final GamePanel game;
  private int row;
  private int col;
  private UnitType type;

  protected int hitpoints;
  protected int strength;

  public Unit(GamePanel game, int row, int col,UnitType type) {
    this.game = game;
    this.type=type;
    this.row = row;
    this.col = col;



  }

  public void placeUnit(int row, int col) {
    if (game.occupied(row, col)) return;
    game.removeUnit(this.row, this.col);
    game.placeUnit( row, col,type);
    this.row = row;
    this.col = col;
  }

  public int getRow() {
    return row;
  }

  public int getCol() {
    return col;
  }

  public boolean isStationary() {
    return false;
  }

  public boolean isLivingPlant() {
    return false;
  }

  public boolean isLivingBug() {
    return false;
  }

  public boolean isLivingEnemy() {
    return false;
  }

  public void act(Set<Unit> units) {


  }

  protected void moveRandomly() {
    placeUnit(randomWalk(row), randomWalk(col));
  }

  protected void moveTowards(Unit other) {
    int nextrow = row;
    int nextcol = col;
    if (row < other.row) nextrow++;
    if (row > other.row) nextrow--;
    if (col < other.col) nextcol++;
    if (col > other.col) nextcol--;
    placeUnit(nextrow, nextcol);
  }

  private int randomWalk(int r) {
    if (Math.random() < 0.25) return r - 1;
    if (Math.random() > 0.75) return r + 1;
    return r;
  }


  protected void attack(Unit other) {
    System.out
        .println(this.type + " hits " + other.type + " Remaining Hitpoints: " + other.hitpoints);
    other.hit(strength);
  }

  private void hit(int strength) {
    hitpoints -= strength;
  }

  protected boolean isNeighbor(Unit other, int dist) {
    return Math.abs(row - other.row) <= dist &&
        Math.abs(col - other.col) <= dist;
  }

  protected int distance(Unit me, Unit a, Unit b) {
    var d1 = distance(me, a);
    var d2 = distance(me, b);
    return Double.compare(d1, d2);
  }

  private double distance(Unit me, Unit b) {
    return Math.sqrt(square(me.row - b.row) + square(me.col - b.col));
  }

  private double square(int v) {
    return v * v;
  }

  public boolean isDead() {
    return hitpoints <= 0;
  }

  public boolean isAlive() {
    return hitpoints > 0;
  }
}


Das klingt halt alles nach Interface, aber die Methoden, wie sich die Spieler bewegen sind ja für alle Arten gleich, deswegen passt kein Interface. Achso, natürlich habe ich meine einzelnen Spielerklassen alle von Unit erben lassen. Jemand eine Idee, was ich jetzt mit den Methoden machen kann? Abstrakt können sie ja auch nicht sein....
a) natürlich können die Methoden abstrakt sein
b) natürlich kannst Du ein Interface verwenden
 

Mariexshhx

Bekanntes Mitglied
@temi
Java:
package de.propra.defense;

import static de.propra.defense.UnitType.BUG1;
import static de.propra.defense.UnitType.BUG2;
import static de.propra.defense.UnitType.CROW;
import static de.propra.defense.UnitType.FROG;
import static de.propra.defense.UnitType.PLANT;
import static de.propra.defense.UnitType.SCARECROW;


import de.propra.defense.ui.GamePanel;
import java.util.Optional;
import java.util.Set;

public class Unit {

  private final GamePanel game;
  private int row;
  private int col;
  private UnitType type;

  protected int hitpoints;
  protected int strength;

  public Unit(GamePanel game, int row, int col,UnitType type) {
    this.game = game;
    this.type=type;
    this.row = row;
    this.col = col;



  }

  public void placeUnit(int row, int col) {
    if (game.occupied(row, col)) return;
    game.removeUnit(this.row, this.col);
    game.placeUnit( row, col,type);
    this.row = row;
    this.col = col;
  }

  public int getRow() {
    return row;
  }

  public int getCol() {
    return col;
  }

  public boolean isStationary() {
    return false;
  }

  public boolean isLivingPlant() {
    return false;
  }

  public boolean isLivingBug() {
    return false;
  }

  public boolean isLivingEnemy() {
    return false;
  }

  public void act(Set<Unit> units) {


  }

  protected void moveRandomly() {
    placeUnit(randomWalk(row), randomWalk(col));
  }

  protected void moveTowards(Unit other) {
    int nextrow = row;
    int nextcol = col;
    if (row < other.row) nextrow++;
    if (row > other.row) nextrow--;
    if (col < other.col) nextcol++;
    if (col > other.col) nextcol--;
    placeUnit(nextrow, nextcol);
  }

  private int randomWalk(int r) {
    if (Math.random() < 0.25) return r - 1;
    if (Math.random() > 0.75) return r + 1;
    return r;
  }


  protected void attack(Unit other) {
    System.out
        .println(this.type + " hits " + other.type + " Remaining Hitpoints: " + other.hitpoints);
    other.hit(strength);
  }

  private void hit(int strength) {
    hitpoints -= strength;
  }

  protected boolean isNeighbor(Unit other, int dist) {
    return Math.abs(row - other.row) <= dist &&
        Math.abs(col - other.col) <= dist;
  }

  protected int distance(Unit me, Unit a, Unit b) {
    var d1 = distance(me, a);
    var d2 = distance(me, b);
    return Double.compare(d1, d2);
  }

  private double distance(Unit me, Unit b) {
    return Math.sqrt(square(me.row - b.row) + square(me.col - b.col));
  }

  private double square(int v) {
    return v * v;
  }

  public boolean isDead() {
    return hitpoints <= 0;
  }

  public boolean isAlive() {
    return hitpoints > 0;
  }
}



a) natürlich können die Methoden abstrakt sein
b) natürlich kannst Du ein Interface verwenden
muss die Klasse nicht abstrakt sein damit die Methode abstrakt sein kann?
und ein Interface gibt doch nur die zu Implementierenden Methoden vor, aber enthält doch selber keine Implemetierung ?
 

mihe7

Top Contributor
Ja, beides richtig - ist aber beides kein Problem.

Zum Beispiel: Interface Unit, abstrakte Klasse AbstractUnit, davon abgeleitete konkrete Klassen für die Spielertypen.
 

KonradN

Super-Moderator
Mitarbeiter
Ja, beides richtig - ist aber beides kein Problem.
Nö das würde ich anders sehen: das Zweite ist nicht richtig. Ein Interface gibt zwar die zu implementierenden Methoden vor aber kann zusätzlich auch Implementierungen enthalten - die default Methoden.

Beispiele finden sich viele, z.B. bei sehr vielen functional Interfaces. Einfach mal Predicate angeschaut (War irgendwie das Erste, das mit eingefallen ist):

Und da findet man gleich 3 default Methoden. Und auch noch 2 static Methoden - das geht natürlich auch noch :)
 

Mariexshhx

Bekanntes Mitglied
das Problem ist, wenn ich die Methode act abstrakt mache muss auch die Klasse Plant diese implemetieren. Eine Pflanze hat aber keine implemetierung für act.
act betrifft nur Frog, Bug1 und Bug2
also es ist eine void Methode theoretisch kann ich die Implemtierung in den Klassen wo act nix tut weglassen. Aber ich denke nicht, dass das die Lösung ist...
 

KonradN

Super-Moderator
Mitarbeiter
das Problem ist, wenn ich die Methode act abstrakt mache muss auch die Klasse Plant diese implemetieren. Eine Pflanze hat aber keine implemetierung für act
Dann gehört diese Methode nicht da hin. Wenn nicht alle Unit Instanzen act haben, dann ist das einfach kein Bestandteil von Act.

Das ist ja das, was man immer hat. Nehmen wir einfach mal die Biologie:
Du hast von mir aus eine Katze und Hund. Beide säugen Nachkommen. Beides sind Lebewesen. Also könnte man meinen, dass man säugen in Lebewesen packt. Aber dann kriegen wir ein neues Lebewesen - das säugt Nachkommen nicht: Die Biene.

Also merken wir: säugen gehört nicht in Lebewesen. Man kann aber jetzt eine neue Klasse erzeugen: Säugetier. Säugetier erbt von Lebewesen, Hund und Katze erben von Säugetier. Und das säugen wandert von Lebewesen zu Säugetier.

Das nur um es einmal auf die Schnelle zu skizzieren.
 

Mariexshhx

Bekanntes Mitglied
Dann gehört diese Methode nicht da hin. Wenn nicht alle Unit Instanzen act haben, dann ist das einfach kein Bestandteil von Act.

Das ist ja das, was man immer hat. Nehmen wir einfach mal die Biologie:
Du hast von mir aus eine Katze und Hund. Beide säugen Nachkommen. Beides sind Lebewesen. Also könnte man meinen, dass man säugen in Lebewesen packt. Aber dann kriegen wir ein neues Lebewesen - das säugt Nachkommen nicht: Die Biene.

Also merken wir: säugen gehört nicht in Lebewesen. Man kann aber jetzt eine neue Klasse erzeugen: Säugetier. Säugetier erbt von Lebewesen, Hund und Katze erben von Säugetier. Und das säugen wandert von Lebewesen zu Säugetier.

Das nur um es einmal auf die Schnelle zu skizzieren.
ah okay also würdest du die Methode gar nicht überschreiben sondern komplett aus Unit entfernen und nur in den Klassen Frog, Bug1,Bug2 implementieren ?
 

KonradN

Super-Moderator
Mitarbeiter
Nein, nicht ganz.

Zwei Möglichkeiten:
a) Rein mit Vererbung, dann hätte man sowas wie eine ActableUnit, welche von Unit erbt wovon dann Frog, Bug1, ... erben können.
b) Mit Interfaces. Dann gibt es einfach ein Interface Actable welches Frog, Bug1, .... implementieren können.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
C Vererbung, Interface etc. Java Basics - Anfänger-Themen 6
P Unterschied zwischen Interface und Vererbung und Sinn? Java Basics - Anfänger-Themen 5
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
P Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
M Interface als Datentyp Java Basics - Anfänger-Themen 12
K Interface Methoden überschreiben Java Basics - Anfänger-Themen 1
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben