OOP Vererbung von Interfaces

nieselfriem

Bekanntes Mitglied
Hallo!

Ich habe mir für eine Datenbankimplementierung mit ein Interface erstellt und für die jeweiligen Datenbank Entitäten das Interface spezialisiert:
Oberinterface:
Java:
public interface DAO {
    public Object retrieve();
    public void add(Object entry);
    public void update(Object entry);
}
die Spezialisierungen:
Bewerber:
Java:
public interface BewerberDAO extends DAO{
    public Bewerber retrieve();
    public void add(Bewerber entry);
    public void update(Bewerber entry);
}
Arbeitgeber:
Java:
public interface ArbeitgeberDAO extends DAO{
    public Arbeitgeber retrieve();
    public void add(Bewerber entry);
    public void update(Bewerber entry);
}
nun habe ich das Interface "BewerberDAO" mit folgender Klasse implementiert:
Java:
package testjahb;

import java.sql.*;

public class SQLBewerberDAO implements BewerberDAO{
    private Connection conn;

    SQLBewerberDAO() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost/jahbtest?user=root&password=werner80");
        }
        catch(ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        catch(SQLException ex) {
            ex.printStackTrace();
        }
    }//Kontruktor

    public Bewerber retrieve() {
        Bewerber bew = new Bewerber();
        if(conn != null) {
            try {
                PreparedStatement stmt = conn.prepareStatement("BId , Name, Vorname FROM Bewerber");
                ResultSet rs = stmt.executeQuery();

                while(rs.next()) {
                    int bid = rs.getInt(1);
                    String name = rs.getString(2);
                    String vorname = rs.getString(3);
                    bew.setName(name);
                    bew.setVorname(vorname);
                    bew.setId(bid);
                }

                conn.close();

            }catch(SQLException ex) {
                ex.printStackTrace();
            }
        }
        return bew;
    }

    public void add(Bewerber entry) {
        if (conn != null) {
            try {
                PreparedStatement stmt = conn.prepareStatement(
                        "INSERT INTO bewerber " +
                        "(Name, Vorname) " +
                        "VALUES (?,?)");
                stmt.setString(1, entry.getName());
                stmt.setString(2, entry.getVorname());

                stmt.executeUpdate();

                conn.close();
            }catch(SQLException ex) {
                ex.printStackTrace();
            }//catch
        }//if
    }//add

    public void update(Bewerber entry) {
        if(conn != null) {
            try {
                PreparedStatement stmt = conn.prepareStatement(
                        "UPDATE Bewerber SET "+
                        "Name = ?, Vorname = ? WHERE Bid = ?");
                stmt.setString(1, entry.getName());
                stmt.setString(2, entry.getVorname());
                stmt.executeUpdate();
                conn.close();
            }
            catch(SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
}//SQLBewerberDAO
Nun gibt es zwei Fragen

1. Wieso bekomme ich die Fehlermeldung:
Code:
testjahb.SQLBewerberDAO is not abstract and does not override abstract method update(java.lang.Object) in testjahb.DAO
public class SQLBewerberDAO implements BewerberDAO...
Obwohl die Methode implementiert worden ist.
Bei den Methoden "retrieve()", "add()" gibt es merkwürdigerweise keine Probleme.
2. Ist die Vererbungshierachie der Interfaces so wie ich sie gemacht habe sinnvoll?

Gruß niesel
 
Benutze Generics:
Java:
public interface DAO<T> {
  void add(T entry);
}

public interface BewerberDao extends DAO<Bewerber> {
  ...
}

public class BewerberDaoImpl implements BewerberDao {
  void add(Bewerber entry) { ... }
}
 
Dafür reicht eine generisches Interface:
Java:
interface DAO<T> {
    public T retrieve();
    public void add(T entry);
    public void update(T entry);
}
Das kann man dann direkt implementieren. Die "Zwischen" Interfaces sind dann überflüssig.
 
Dafür reicht eine generisches Interface:
Java:
interface DAO<T> {
    public T retrieve();
    public void add(T entry);
    public void update(T entry);
}
Das kann man dann direkt implementieren. Die "Zwischen" Interfaces sind dann überflüssig.

Jo stimmt, wenn das alle Methoden sind reicht das generische Interface, falls mehr gebraucht werden je nach Datentyp sollten abgeleitete Interfaces genutzt werden wie im Beispiel.
 
Hab ich auf die zweite Variante geändert. und die oberste Zeile wie folgt geändert:
Interface DAO:
Java:
public interface DAO<T> {

    public T retrieve();
    public void add(T entry);
    public void update(T entry);
}

Java:
public class SQLBewerberDAO implements DAO
...

Jedoch kommt immer noch die Fehlermeldung
Code:
SQLBewerberDAO is not abstract and does not override abstract method update(java.lang.Object) in testjahb.DAO
public class SQLBewerberDAO implements DAO{

?🙁
 
Java:
implements DAO
Wenn du hier keinen generischen Typ angibst wird Object als Default genommen
 
Tut mir Leid, dass das Thema nicht direkt dem Problem des TO zu tun hat, aber was wäre denn eine geeignete Methode um Passwörter zu verschleiern, später aber wieder zu verwenden sind? (Also z.B. kein md5). Beispielsweise für Datenbankzugangsdaten in xml Dateien?
 
Tut mir Leid, dass das Thema nicht direkt dem Problem des TO zu tun hat, aber was wäre denn eine geeignete Methode um Passwörter zu verschleiern, später aber wieder zu verwenden sind? (Also z.B. kein md5). Beispielsweise für Datenbankzugangsdaten in xml Dateien?
Hm, warum erstellst du dann keinen neuen Thread dafür?
Wofür wollst du die denn Datenbankdaten verschlüsseln? In der Regel sollte solche Daten nicht auf nem clientsystem liegen.
 

Zurück
Oben