Come posso creare una classe genitore astratta che utilizza i dati di una classe ereditata?

1

Mi sto bagnando i piedi con lo sviluppo di app Android e mi sto legando per trovare un buon modo per gestire le interazioni tra database su più oggetti simili. Il mio obiettivo era avere una struttura del tipo:

public abstract class DatabaseObject{

    public static abstract String getTableName();
    public static abstract SQLiteDatabase getDB();
    public static void dropTable(){
        getDB().execSQL("DROP TABLE IF EXISTS " + getTableName());
    }
}

public class Book extends DatabaseObject{

    public static final String TABLE_NAME = "book";
    private String author;
    private static SQLiteDatabase _db;

    public static setDB(SQLiteDatabase db){
        _db = db;
    }

    @Override
    public static String getTableName(){
        return TABLE_NAME;
    }

    @Override
    public static SQLiteDatabase getDB(){
        return _db;
    }

    public String getAuthor(){
        return author;
    }

    public void getAuthor(String auth){
        author = auth;
    }
}

Ultimamente ho lavorato su un progetto che utilizza Hibernate, quindi sono abituato ad avere una classe che può essere utilizzata in tutta l'applicazione e contiene anche la possibilità di mantenere i suoi dati nel database. Sfortunatamente, "l'abstract statico" non è permesso in Java, quindi non funzionerebbe.

Il mio piano attuale è di avere ognuna delle classi come "Book" che ho intenzione di usare implementare un'interfaccia e che una classe esterna gestisca le comuni interazioni db invece della classe antenato.

C'è un modo migliore per realizzare ciò che sto cercando di fare?

    
posta mowwwalker 26.08.2015 - 01:11
fonte

3 risposte

1

Penso che tu possa adattare il modello di visitatore per il tuo requisito.

La tua classe Book dovrebbe implementare un'interfaccia, in genere denominata Visitable.

public interface Visitable{
  public void accept(Visitor visitor);
}

Ora, per la tua classe di libri, passi in un visitatore che esegue le operazioni necessarie. Implementa questo metodo nella classe del libro.

public class Book implements Visitable{
  public void accept(Visitor visitor){
    visitor.visit(this);
  }
}

Ora, controlliamo la parte visitatore. Se il tuo insieme di azioni sarà comune a tutte le entità, implementa un visitatore generico.

public interface Visitor{
  public void visit(DatabaseObject dbo);
}

Diamo un'occhiata al visitatore stesso ora.

public class DBOVisitor implements Visitor{
  public void visit(DatabaseObject dbo){
    String tableName = dbo.getTableName();
    String tableDropSQL = "DROP TABLE "+tableName;
    getDB().execSQL(tableDropSQL);
  }
}

Spero che tu ne abbia l'idea. Sentiti libero di adattarlo. Aggiungi metodi specifici se vuoi e, come sempre, dai un nome ai metodi in modo significativo. Spero che questo aiuti!

    
risposta data 26.08.2015 - 08:53
fonte
0

Ciò funzionerebbe se si eliminasse tutto il statics dalla classe base e il abstract dal metodo con un'implementazione. Pensa a come i metodi verranno chiamati dai client: o aBook.dropTable() o Book.dropTable() ha senso, ma DatabaseObject.dropTable() no; quale tabella vuoi eliminare?

Senza dubbio ci sono modi migliori per fare cose, ad es. link .

    
risposta data 26.08.2015 - 01:29
fonte
0

Facile.

  • Passa il nome della tabella da Book (e da tutte le altre classi concrete) in un costruttore della classe astratta.
  • Salva il nome della tabella nella classe astratta e usalo direttamente dove necessario.
  • Rimuovi il metodo getTableName

Spiacente, la mia risposta è così breve, sto modificando l'app mobile.

    
risposta data 26.08.2015 - 19:11
fonte

Leggi altre domande sui tag