我正在尝试用TUI做一个小游戏。 TUI应该有data=<${file_data>
方法,该方法应该使用get()
和返回类型作为参数,因此您可以使用它来请求对象。
例如,String question
应返回get("What is your name?", String)
,而String
应返回get("What color do you want?", Color)
。
这就是我想出来的:
Color
不幸的是,public interface View {
public <T> T get(String question, Class<T> type) throws InputException;
}
public class TUI implements View {
public Color get(String question, Class<Color> type) {
// code
}
public String get(String question, Class<String> type) {
// code
}
}
Color color = Game.getView().get("What piece do you want to place?", Color.class);
中的方法不被接受为公共TUI
的实现。我有什么方法可以做到这一点吗?
答案 0 :(得分:6)
通过拆分函数保持类型安全似乎更合适:
Color color = Game.getView().getColor("What piece do you want to place?");
String string = Game.getView().getString("What piece do you want to place?");
答案 1 :(得分:0)
尝试分别使用方法
创建两个实现View的类AskColor和AskString public Color get(String question, Class<Color> type) {
// code
}
public String get(String question, Class<String> type) {
// code
}
和界面View with method
public T get(String question, Class<T> type) throws InputException;
答案 2 :(得分:0)
您的TUI
类无效,因为在类型擦除下,两个get
方法都具有相同的参数。
您可能想要这样做:
public interface View<T> {
T get(String question, Class<T> type) throws InputException;
}
public class ColorTUI implements View<Color> {
public Color get(String question, Class<Color> type) {
// code
}
}
public class StringTUI implements View<String> {
public String get(String question, Class<String> type) {
// code
}
}
答案 3 :(得分:0)
您可以使用类似于模板方法设计模式的内容。
public interface TypeTemplate {
public Object get(String question);
}
public class ColorTemplate implements TypeTemplate {
@Override public Color get(String question) { /*code for color*/ }
}
public class StringTemplate implements TypeTemplate {
@Override public String get() { /*code for string*/ }
}
public class TUI {
public Color get(String question, ColorTemplate templ) {
return templ.get(String question)
}
public String get(String question, StringTemplate templ) {
return templ.get(String question);
}
}
public static void main(String args[]) {
TUI tui = new TUI();
String string = tui.get("What is your name?", new StringTemplate());
Color color = tui.get("What color do you want?", new ColorTemplate());
}
您当然可以使用不太通用的内容替换Object
中的TypeTemplate
类型。你也可以使TypeTemplate
一个抽象类;这样,如果所有(或某些)get()
方法必须共享某些代码,您可以在此类中添加方法并从子类调用。 e.g。
public abstract class TypeTemplate {
public abstract Object get(String question);
protected void init() {/*some initialization code*/}
protected void cleanup(){/*some more code*/}
}
public class ColorTemplate implements TypeTemplate {
@Override
public Color get(String question) {
init();
/*code for color*/
cleanup();
}
}
public class StringTemplate implements TypeTemplate {
@Override
public String get() {
init();
/*code for string*/
cleanup();
}
}