|
6. Herencia
Hasta ahora siempre hemos trabajado con lo concreto (es decir, el tipo más específico de un objeto). ¿ Que sucede con las subclasificaciones e interfaces ?
Para explorar esto, diferenciaremos entre diferentes tipos de sensores.
package com.db4o.f1.chapter4;
import java.util.*;
public class SensorReadout {
private Date time;
private Car car;
private String description;
protected SensorReadout(Date time,Car car,String description) {
this.time=time;
this.car=car;
this.description=description;
}
public Car getCar() {
return car;
}
public Date getTime() {
return time;
}
public String getDescription() {
return description;
}
public String toString() {
return car+" : "+time+" : "+description;
}
}
| |
package com.db4o.f1.chapter4;
import java.util.*;
public class TemperatureSensorReadout extends SensorReadout {
private double temperature;
public TemperatureSensorReadout(
Date time,Car car,
String description,double temperature) {
super(time,car,description);
this.temperature=temperature;
}
public double getTemperature() {
return temperature;
}
public String toString() {
return super.toString()+" temp : "+temperature;
}
}
| |
package com.db4o.f1.chapter4;
import java.util.*;
public class PressureSensorReadout extends SensorReadout {
private double pressure;
public PressureSensorReadout(
Date time,Car car,
String description,double pressure) {
super(time,car,description);
this.pressure=pressure;
}
public double getPressure() {
return pressure;
}
public String toString() {
return super.toString()+" pressure : "+pressure;
}
}
| |
El mecanismo de captura de nuestro auto es cambiado apropiadamente.
package com.db4o.f1.chapter4;
import java.util.*;
public class Car {
private String model;
private Pilot pilot;
private List history;
public Car(String model) {
this.model=model;
this.pilot=null;
this.history=new ArrayList();
}
public Pilot getPilot() {
return pilot;
}
public void setPilot(Pilot pilot) {
this.pilot=pilot;
}
public String getModel() {
return model;
}
public SensorReadout[] getHistory() {
return (SensorReadout[])history.toArray(new SensorReadout[history.size()]);
}
public void snapshot() {
history.add(new TemperatureSensorReadout(
new Date(),this,"oil",pollOilTemperature()));
history.add(new TemperatureSensorReadout(
new Date(),this,"water",pollWaterTemperature()));
history.add(new PressureSensorReadout(
new Date(),this,"oil",pollOilPressure()));
}
protected double pollOilTemperature() {
return 0.1*history.size();
}
protected double pollWaterTemperature() {
return 0.2*history.size();
}
protected double pollOilPressure() {
return 0.3*history.size();
}
public String toString() {
return model+"["+pilot+"]/"+history.size();
}
}
| |
6.1. Almacenamiento
Nuestro código de configuración no ha cambiado en absoluto, sólo el funcionamiento interno de una captura.
[storeFirstCar]
Car car1=new Car("Ferrari");
Pilot pilot1=new Pilot("Michael Schumacher",100);
car1.setPilot(pilot1);
db.set(car1);
| |
[storeSecondCar]
Pilot pilot2=new Pilot("Rubens Barrichello",99);
Car car2=new Car("BMW");
car2.setPilot(pilot2);
car2.snapshot();
car2.snapshot();
db.set(car2);
| |
6.2. Recuperación
db4o nos dará todos los objetos de un tipo dado. Para recolectar todas las instancias de una clase dada, no importa si son miembros de subclases o instancias directas, solo proveemos un prototipo correspondiente.
[retrieveTemperatureReadoutsQBE]
SensorReadout proto=
new TemperatureSensorReadout(null,null,null,0.0);
ObjectSet result=db.get(proto);
listResult(result);
| |
[retrieveAllSensorReadoutsQBE]
SensorReadout proto=new SensorReadout(null,null,null);
ObjectSet result=db.get(proto);
listResult(result);
| |
Hay una situación más donde QBE no puede ser aplicable: ¿ Que sucede si el tipo dado es una interface de una clase abstracta ? Bueno, hay un pequeño truco al rescate: Los objetos de clase reciben un tratamiento especial con QBE.
[retrieveAllSensorReadoutsQBEAlternative]
ObjectSet result=db.get(SensorReadout.class);
listResult(result);
| |
Y por supuesto está nuestra API de consultas al rescate.
[retrieveAllSensorReadoutsQuery]
Query query=db.query();
query.constrain(SensorReadout.class);
ObjectSet result=query.execute();
listResult(result);
| |
Este procedimiento se aplica a todos los objetos de primera clase. Podemos simplemente consultar por todos los objetos presentes en la base de datos, por ejemplo.
[retrieveAllObjects]
ObjectSet result=db.get(new Object());
listResult(result);
| |
6.3. Actualizando y borrando
es lo mismo para todos los objetos, no importa en que parte del árbol de herencia se encuentran.
Así como recuperamos todos los objetos de la base de datos arriba, podemos borrar todos los objetos almacenados para preparala para el próximo capítulo.
[deleteAllObjects]
ObjectSet result=db.get(new Object());
while(result.hasNext()) {
db.delete(result.next());
}
| |
6.4. Conclusión
Ahora hemos cubierto todas las características básicas de la OO y la forma en que son manejadas por db4o. Completaremos la primera parte de nuestro paseo por db4o en el próximo capítulo mirando en profundidad grafos de objetos, incluyendo estructuras recursivas.
6.5. Fuente completo
package com.db4o.f1.chapter4;
import java.io.*;
import com.db4o.*;
import com.db4o.f1.*;
import com.db4o.query.*;
public class InheritanceExample extends Util {
public static void main(String[] args) {
new File(Util.YAPFILENAME).delete();
ObjectContainer db=Db4o.openFile(Util.YAPFILENAME);
try {
storeFirstCar(db);
storeSecondCar(db);
retrieveTemperatureReadoutsQBE(db);
retrieveAllSensorReadoutsQBE(db);
retrieveAllSensorReadoutsQBEAlternative(db);
retrieveAllSensorReadoutsQuery(db);
retrieveAllObjects(db);
deleteAllObjects(db);
}
finally {
db.close();
}
}
public static void storeFirstCar(ObjectContainer db) {
Car car1=new Car("Ferrari");
Pilot pilot1=new Pilot("Michael Schumacher",100);
car1.setPilot(pilot1);
db.set(car1);
}
public static void storeSecondCar(ObjectContainer db) {
Pilot pilot2=new Pilot("Rubens Barrichello",99);
Car car2=new Car("BMW");
car2.setPilot(pilot2);
car2.snapshot();
car2.snapshot();
db.set(car2);
}
public static void retrieveAllSensorReadoutsQBE(
ObjectContainer db) {
SensorReadout proto=new SensorReadout(null,null,null);
ObjectSet result=db.get(proto);
listResult(result);
}
public static void retrieveTemperatureReadoutsQBE(
ObjectContainer db) {
SensorReadout proto=
new TemperatureSensorReadout(null,null,null,0.0);
ObjectSet result=db.get(proto);
listResult(result);
}
public static void retrieveAllSensorReadoutsQBEAlternative(
ObjectContainer db) {
ObjectSet result=db.get(SensorReadout.class);
listResult(result);
}
public static void retrieveAllSensorReadoutsQuery(
ObjectContainer db) {
Query query=db.query();
query.constrain(SensorReadout.class);
ObjectSet result=query.execute();
listResult(result);
}
public static void retrieveAllObjects(ObjectContainer db) {
ObjectSet result=db.get(new Object());
listResult(result);
}
public static void deleteAllObjects(ObjectContainer db) {
ObjectSet result=db.get(new Object());
while(result.hasNext()) {
db.delete(result.next());
}
}
}
| |
-- generated by Doctor courtesy of db4objecs Inc.
|