6. 继承
到现在为止,我们已经可以操作实体类了。但是如何操作子类或者接口呢?
为了方便讲解,我们将创造不同种类的sensors

Sensor
using System;
namespace Db4objects.Db4o.Tutorial.F1.Chapter4


{
public class SensorReadout

{
DateTime _time;
Car _car;
string _description;
public SensorReadout(DateTime time, Car car, string description)

{
_time = time;
_car = car;
_description = description;
}
public Car Car

{
get

{
return _car;
}
}
public DateTime Time

{
get

{
return _time;
}
}
public string Description

{
get

{
return _description;
}
}
override public string ToString()

{
return string.Format("{0}:{1}:{2}", _car, _time, _description);
}
}
}


TemperatureSensorReadout
using System;
namespace Db4objects.Db4o.Tutorial.F1.Chapter4


{
public class TemperatureSensorReadout : SensorReadout

{
double _temperature;
public TemperatureSensorReadout(DateTime time, Car car, string description, double temperature)
: base(time, car, description)

{
_temperature = temperature;
}
public double Temperature

{
get

{
return _temperature;
}
}
override public string ToString()

{
return string.Format("{0} temp: {1}", base.ToString(), _temperature);
}
}
}


PressureSensorReadout
using System;
namespace Db4objects.Db4o.Tutorial.F1.Chapter4


{
public class PressureSensorReadout : SensorReadout

{
double _pressure;
public PressureSensorReadout(DateTime time, Car car, string description, double pressure)
: base(time, car, description)

{
_pressure = pressure;
}
public double Pressure

{
get

{
return _pressure;
}
}
override public string ToString()

{
return string.Format("{0} pressure: {1}", base.ToString(), _pressure);
}
}
}

Car的snapshot也要跟着变化:

new car
using System;
using System.Collections;
namespace Db4objects.Db4o.Tutorial.F1.Chapter4


{
public class Car

{
string _model;
Pilot _pilot;
IList _history;
public Car(string model)

{
_model = model;
_pilot = null;
_history = new ArrayList();
}
public Pilot Pilot

{
get

{
return _pilot;
}
set

{
_pilot = value;
}
}
public string Model

{
get

{
return _model;
}
}
public SensorReadout[] GetHistory()

{
SensorReadout[] history = new SensorReadout[_history.Count];
_history.CopyTo(history, 0);
return history;
}
public void Snapshot()

{
_history.Add(new TemperatureSensorReadout(DateTime.Now, this, "oil", PollOilTemperature()));
_history.Add(new TemperatureSensorReadout(DateTime.Now, this, "water", PollWaterTemperature()));
_history.Add(new PressureSensorReadout(DateTime.Now, this, "oil", PollOilPressure()));
}
protected double PollOilTemperature()

{
return 0.1*_history.Count;
}
protected double PollWaterTemperature()

{
return 0.2*_history.Count;
}
protected double PollOilPressure()

{
return 0.3*_history.Count;
}
override public string ToString()

{
return string.Format("{0}[{1}]/{2}", _model, _pilot, _history.Count);
}
}
}

6.1. 存储
代码只是加入了与sensor的交互而已,其他部分没有动:
// storeFirstCar
Car car1 = new Car("Ferrari");
Pilot pilot1 = new Pilot("Michael Schumacher", 100);
car1.Pilot = pilot1;
db.Set(car1);
// storeSecondCar
Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
Car car2 = new Car("BMW");
car2.Pilot = pilot2;
car2.Snapshot();
car2.Snapshot();
db.Set(car2);
6.2. 检索
db4o提供所有的给定类型的对象。在检索给定类型的对象时候,不管他们是否是子类或者其他,只要给出一个原型就可以。
// retrieveTemperatureReadoutsQBE
SensorReadout proto = new TemperatureSensorReadout(DateTime.MinValue, null, null, 0.0);
IObjectSet result = db.Get(proto);
ListResult(result);
// retrieveAllSensorReadoutsQBE
SensorReadout proto = new SensorReadout(DateTime.MinValue, null, null);
IObjectSet result = db.Get(proto);
ListResult(result);
当在如下情况时QBE就不合适了:如果给定的类是一个接口或者抽象类。有一个小诀窍:只要获取对象的类型就可以了
// retrieveAllSensorReadoutsQBEAlternative
IObjectSet result = db.Get(typeof(SensorReadout));
ListResult(result);
当然,还有SODA API:
// retrieveAllSensorReadoutsQuery
IQuery query = db.Query();
query.Constrain(typeof(SensorReadout));
IObjectSet result = query.Execute();
ListResult(result);
6.3. 更新和删除
不管他们在继承树的哪里,他们都和正常的对象一样。.
就像刚刚我们的检索过程, 我们可以删除所有的对象,好进行下一章的讲解。
// deleteAll
IObjectSet result = db.Get(typeof(Object));
foreach (object item in result)


{
db.Delete(item);
}
6.4. 总结
现在我们已经知道了所有的OO特征如何在db4o里面操作。我们将在下一章完成预排工作,下一章将可以看到深层次的探险,包括循环结构。
6.5. 完整代码
锘縰sing System;
using System.IO;
using Db4objects.Db4o;
using Db4objects.Db4o.Query;
namespace Db4objects.Db4o.Tutorial.F1.Chapter4


{
public class InheritanceExample : Util

{
public static void Main(string[] args)

{
File.Delete(Util.YapFileName);
IObjectContainer db = Db4oFactory.OpenFile(Util.YapFileName);
try

{
StoreFirstCar(db);
StoreSecondCar(db);
RetrieveTemperatureReadoutsQBE(db);
RetrieveAllSensorReadoutsQBE(db);
RetrieveAllSensorReadoutsQBEAlternative(db);
RetrieveAllSensorReadoutsQuery(db);
RetrieveAllObjects(db);
}
finally

{
db.Close();
}
}
public static void StoreFirstCar(IObjectContainer db)

{
Car car1 = new Car("Ferrari");
Pilot pilot1 = new Pilot("Michael Schumacher", 100);
car1.Pilot = pilot1;
db.Set(car1);
}
public static void StoreSecondCar(IObjectContainer db)

{
Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
Car car2 = new Car("BMW");
car2.Pilot = pilot2;
car2.Snapshot();
car2.Snapshot();
db.Set(car2);
}
public static void RetrieveAllSensorReadoutsQBE(IObjectContainer db)

{
SensorReadout proto = new SensorReadout(DateTime.MinValue, null, null);
IObjectSet result = db.Get(proto);
ListResult(result);
}
public static void RetrieveTemperatureReadoutsQBE(IObjectContainer db)

{
SensorReadout proto = new TemperatureSensorReadout(DateTime.MinValue, null, null, 0.0);
IObjectSet result = db.Get(proto);
ListResult(result);
}
public static void RetrieveAllSensorReadoutsQBEAlternative(IObjectContainer db)

{
IObjectSet result = db.Get(typeof(SensorReadout));
ListResult(result);
}
public static void RetrieveAllSensorReadoutsQuery(IObjectContainer db)

{
IQuery query = db.Query();
query.Constrain(typeof(SensorReadout));
IObjectSet result = query.Execute();
ListResult(result);
}
public static void RetrieveAllObjects(IObjectContainer db)

{
IObjectSet result = db.Get(new object());
ListResult(result);
}
}
}
