我有以下类型:
public class Vehicle { ... }
通过用户动作实例化车辆。将其视为发明游戏,用户可以创建他/她想要的任何类型的车辆。对于车辆的每个物体,我需要定期记录物体的状态。所以我有以下课程:
public abstract class Log { ... }
public class LogTyre extends Log { ... }
public class LogHandle extends Log { ... }
public class LogBrake extends Log { ... }
public class LogEngine extends Log { ... }
...etc...
另外一个复杂因素是每辆车都有不同的日志记录要求。例如,自行车型车辆不需要LogEngine对象。
因此,在我实例化车辆时,我需要存储车辆所需的日志类型的类类型。因此,当需要执行日志时,记录器将能够为该特定车辆实例化必要的日志记录类。我怎样才能在Java中实现这一目标?或者也许只是在OOP中。
任何帮助将不胜感激,谢谢。
答案 0 :(得分:0)
假设您需要访问的方法是由日志定义的,您是否可以在日志类中添加“日志类型”枚举,以便查找每个日志?类似的东西:
private void logStuff(LogType logType, Map<LogType, Log> vehicleLogs){
Log log = vehicleLogs.get(logType);
if(log != null){
log.doLogStuff();
}
}
其中LogType具有Handle,Engine等值
答案 1 :(得分:0)
我不确定我是否正确理解了您的问题。但是,在Hovercraft Full of Eels的提示下,编写了以下代码。您可以添加其他类型的日志。希望这有用。
import java.io.PrintStream;
import java.util.ArrayList;
public class Logger {
public static void main(String[] args) {
// creating vehicles
Vehicle[] vs = { new Vehicle("Bike"), new Vehicle("Car") };
// adding logs of different type
vs[0].addLog(new LogTyre("Slim"));
vs[1].addLog(new LogTyre("Wide"));
vs[1].addLog(new LogEngine("Lean burn"));
// maintaining logs
Logger logger = new Logger();
for (Vehicle v: vs)
v.writeLog(logger);
// printing logs
for (Vehicle v: vs)
v.printLogs();
}
public void write(Log log) {
System.out.printf(".. writing to %s.%n", log.name());
// You may write different logs depending on the log types using common methods
}
}
class Vehicle {
String type; // vehicle type
ArrayList<Log> logs; // logs to be maintained
public Vehicle(String type) {
this.type = type;
logs = new ArrayList<Log>();
}
public void addLog(Log log) {
logs.add(log);
}
public void writeLog(Logger w) {
for (Log log: logs)
log.accept(w);
}
public void printLogs() {
for (Log log: logs) {
log.print(System.out);
}
}
}
abstract class Log {
protected String name; // common fields
// accepting the visitor
public void accept(Logger logger) {
logger.write(this);
}
// common methods for maintaining logs
public abstract String name();
public void print(PrintStream ps) {
ps.printf("[Log: %s]%n", name());
}
}
class LogTyre extends Log {
public LogTyre(String name) {
super.name = name;
}
public String name() {
return name+" Tyre Log";
}
}
class LogEngine extends Log {
public LogEngine(String name) {
super.name = name;
}
public String name() {
return name+" Engine Log";
}
}
上述代码的这个键是使用accept方法将Logger传递给Log。然后这个accept方法将调用各种类型日志的相应write方法。