私はJosAH's text-based menu systemの修正版を使用しています。リフレクションを使用してクラスの宣言されたサブクラスから項目のリストを作成する方法を理解しようとしています。異なるメニュー項目は、基礎となるデータを操作するために異なるパラメータを使用するため、インスタンス化を一般化する際に問題が発生しています。リフレクションを使用してテキストベースのメニューを構築する
は例えば、割り当てはカスタムリンクリストを作成することでしたので、メニューオプションがPrint
、Insert
、Save
、Quit
などで構成されます印刷と挿入だけで入力を解析するために、リンクリストへの参照が必要ですリンクされたリスト内の適切な関数を呼び出します。 Save
はさらにファイルを保存する必要があり、Quit
は追加の引数を必要としません。
メニュー項目が必要なパラメータで作成されるようにcreateListを一般化する方法はありますか?
また、この作業にどれくらいの時間がかかっているので、これは完全に強力な解決策であり、このアイデアの大部分またはおそらく全体を取り除かなければならないという可能性があります。
編集:これはこれは私が考えていた、といくつかの回答やコメントを通じて読んだ後、それが正しいものであるかもしれない解決策だった インフォメーション - この作品を追加するのに最適な場所であれば私にはわかりません。 MenuItem
が常に1つのObjectをパラメータとして受け入れる場合、私はgetConstructor
とnewInstance
を呼び出すときにその前提を作ることができます。その後、Objectを特定のクラスに移して、データを引き出すことができるような便利なものにキャストします。
public class MenuItem {
Object data;
public MenuItem(Object data) {
this.data = data;
parseData();
}
protected abstract void parseData();
}
private static class MenuQuit extends MenuItem {
public MenuQuit(Object data) { super(data) } //nothing additional needed
protected void parseData() {} //does nothing
}
private static class MenuSave extends MenuItem { //as outlined above
private CustomLinkedList list;
private File saveFile;
public MenuSave(Object data) {
super(data);
}
//may be able to use reflection to generalize this
protected void parseData() {
this.list = ((MyCustomData) data).list;
this.saveFile = ((MyCustomData) data).saveFile;
}
}
public class MyCustomData {
public CustomLinkedList list;
public File saveFile;
public int otherData;
public MyCustomData(CustomLinkedList a, File b, int c) {} //assignment
}
私はそれが私ができる限りシンプルに保つことを期待して、サブクラス化MenuItems
に複雑にすることを開始するため、この方法を避けるためにしようとしていました。このソリューションを改善する方法はありますか?
私はそれについて考えましたが、データとファイルは単なる例です。私は後で、あらゆる種類の他の引数を必要とするMenuItemを持つかもしれません、そして、私は、MenuItemがそのサブクラスに依存しているという考えが本当に好きではありません。 – pLiKT
一部のフレームワークは、コールバック関数に必要なデータを保持する汎用の(Javaの意味ではない) 'Object'を提供します。どのようにそのことについて? – DerMike
私が元の質問に投稿した解決策は、@DerMikeを参照していたものと似ていますか? – pLiKT