2011-12-03 13 views
0

私はJosAH's text-based menu systemの修正版を使用しています。リフレクションを使用してクラスの宣言されたサブクラスから項目のリストを作成する方法を理解しようとしています。異なるメニュー項目は、基礎となるデータを操作するために異なるパラメータを使用するため、インスタンス化を一般化する際に問題が発生しています。リフレクションを使用してテキストベースのメニューを構築する

は例えば、割り当てはカスタムリンクリストを作成することでしたので、メニューオプションがPrintInsertSaveQuitなどで構成されます印刷と挿入だけで入力を解析するために、リンクリストへの参照が必要ですリンクされたリスト内の適切な関数を呼び出します。 Saveはさらにファイルを保存する必要があり、Quitは追加の引数を必要としません。

メニュー項目が必要なパラメータで作成されるようにcreateListを一般化する方法はありますか?

また、この作業にどれくらいの時間がかかっているので、これは完全に強力な解決策であり、このアイデアの大部分またはおそらく全体を取り除かなければならないという可能性があります。

編集:これはこれは私が考えていた、といくつかの回答やコメントを通じて読んだ後、それが正しいものであるかもしれない解決策だった インフォメーション - この作品を追加するのに最適な場所であれば私にはわかりません。 MenuItemが常に1つのObjectをパラメータとして受け入れる場合、私はgetConstructornewInstanceを呼び出すときにその前提を作ることができます。その後、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に複雑にすることを開始するため、この方法を避けるためにしようとしていました。このソリューションを改善する方法はありますか?

答えて

0

ない正確に答え、
しかし、私は一般的に、ここで反射の大ファンではないので、別のアイデアです:

あなたのベースクラスMenuItemdatafileを追加し、彼らがどこにあるかnullそれらを残すことができます適用できません。

+0

私はそれについて考えましたが、データとファイルは単なる例です。私は後で、あらゆる種類の他の引数を必要とするMenuItemを持つかもしれません、そして、私は、MenuItemがそのサブクラスに依存しているという考えが本当に好きではありません。 – pLiKT

+0

一部のフレームワークは、コールバック関数に必要なデータを保持する汎用の(Javaの意味ではない) 'Object'を提供します。どのようにそのことについて? – DerMike

+0

私が元の質問に投稿した解決策は、@DerMikeを参照していたものと似ていますか? – pLiKT

0

Hmmm。データを必要とせず、無視するだけの議論があったらどうなりますか?

関連する問題