如何在保留过去信息的同时在运行时变形对象?
How to morph an object at runtime while keeping past information?
是否可以根据对象的当前状态在运行时变形对象并保留所有过去的信息?
假设我有以下内容(伪代码):
class Vehicle {
int state, lat, long;
void run();
}
class Plane : Vehicle {
void run() {fly();}
}
class Car : Vehicle {
void run() {drive();}
}
class Boat : Vehicle {
void run() {navigate();}
}
void main() {
// Setup code goes here
Vehicle vehicle = new Vehicle();
while(true) {
switch(vehicle->state){
case(1): vehicle = new Plane();
case(2): vehicle = new Car();
case(3): vehicle = new Boat();
}
}
}
从您编写的意义上来说这是不可能的,但可以设计具有您想要的行为的系统:
- 你有一个对象,它在运行时是同一个对象
- 对象有不同的行为
- 当前行为基于当前状态
它与您所写的内容有很小但非常重要的区别,在这种方法中我们不是变形对象,而只是行为
可能有多种不同的实现,具体取决于全套要求,这是最简单的实现,假设行为仅改变位置:
class Position {
int lat, long;
}
interface PositionCalculator {
Position calc(Position old);
}
class Vehicle {
private Position pos;
void modify(PositionCalculator calc) {pos = calc.calc(pos);}
}
class CarCalculator : PositionCalculator {
Position calc(Position old) {return navigate(old);}
}
class PlaneCalculator : PositionCalculator {
Position calc(Position old) {return fly(old);}
}
void main() {
Vehicle vehicle = new Vehicle();
PositionCalculator plane = new PlaneCalculator()
PositionCalculator car = new CarCalculator();
while(true) {
if (vehicle is in air)
vehicle.modify(plane);
else if (vehicle is on road)
vehicle.modify(car);
}
}
是否可以根据对象的当前状态在运行时变形对象并保留所有过去的信息?
假设我有以下内容(伪代码):
class Vehicle {
int state, lat, long;
void run();
}
class Plane : Vehicle {
void run() {fly();}
}
class Car : Vehicle {
void run() {drive();}
}
class Boat : Vehicle {
void run() {navigate();}
}
void main() {
// Setup code goes here
Vehicle vehicle = new Vehicle();
while(true) {
switch(vehicle->state){
case(1): vehicle = new Plane();
case(2): vehicle = new Car();
case(3): vehicle = new Boat();
}
}
}
从您编写的意义上来说这是不可能的,但可以设计具有您想要的行为的系统:
- 你有一个对象,它在运行时是同一个对象
- 对象有不同的行为
- 当前行为基于当前状态
它与您所写的内容有很小但非常重要的区别,在这种方法中我们不是变形对象,而只是行为
可能有多种不同的实现,具体取决于全套要求,这是最简单的实现,假设行为仅改变位置:
class Position {
int lat, long;
}
interface PositionCalculator {
Position calc(Position old);
}
class Vehicle {
private Position pos;
void modify(PositionCalculator calc) {pos = calc.calc(pos);}
}
class CarCalculator : PositionCalculator {
Position calc(Position old) {return navigate(old);}
}
class PlaneCalculator : PositionCalculator {
Position calc(Position old) {return fly(old);}
}
void main() {
Vehicle vehicle = new Vehicle();
PositionCalculator plane = new PlaneCalculator()
PositionCalculator car = new CarCalculator();
while(true) {
if (vehicle is in air)
vehicle.modify(plane);
else if (vehicle is on road)
vehicle.modify(car);
}
}