ということで、もう少し詳しく説明します。これは、私がやろうとしていることのもう少し冗長なバージョンです。ここで、抽象クラスに派生クラスの適切なメソッドを指すためのインデックスのリストがあることがわかります。UI でタイプをロードしてメニュー項目を作成している場所もわかります。私はこの ItemPointer リストを使用して、ItemPointers をタグ プロパティなどに渡しています。
全体が拡張可能であることを望みます。BaseClass を継承する Class2、Class3 などを追加したい場合があります。BaseClass を使用してプラグインを作成することもできます。派生クラスには、実行可能なメソッドが少なくとも 1 つ含まれますが、多くの場合、メソッドが含まれる可能性があります。したがって、ここの Class1 は単なる例です。これは自分自身を説明するのに役立ちますか? 私に気楽に行ってください、私は学んでいるので、ここで尋ねています。
私がここでしていることはひどいですか?それとも大丈夫ですか?またはより良い方法はありますか?それが私の質問だと思います。より良い方法があれば、例を挙げていただければ幸いです。助けてくれてありがとう。大変感謝しております。
public abstract class BaseClass
{
public List<ItemPointer> ItemPointers = new List<ItemPointer>();
public abstract void Run(int index);
}
public class ItemPointer
{
public int Index { get; set; }
public string ClassType { get; set; }
public string UIDescription { get; set; }
}
public class Class1 : BaseClass
{
public Class1()
{
ItemPointers.Add(new ItemPointer { Index = 0, ClassType = this.GetType().Name, UIDescription = "MethodA Description" });
ItemPointers.Add(new ItemPointer { Index = 1, ClassType = this.GetType().Name, UIDescription = "MethodB Description" });
}
public override void Run(int index)
{
if (index == 0)
{
MethodA();
}
else if (index == 1)
{
MethodB();
}
}
private void MethodA()
{
//do stuff
}
private void MethodB()
{
//do stuff
}
}
public class UIForm
{
private List<BaseClass> _baseClasses;
//Formload events load all baseclass types (including plugins via reflection during form init etc. Then call loadUIitems
private void LoadUIItems()
{
foreach (BaseClass bc in _baseClasses)
{
foreach (var p in bc.ItemPointers)
{
ToolStripMenuItem t = new ToolStripMenuItem(p.UIDescription);
t.Click += new EventHandler(WorkerMenu_Click);
t.Tag = p;
actionsToolStripMenuItem.DropDownItems.Add(t);
}
}
}
void WorkerMenu_Click(object sender, EventArgs e)
{
ToolStripMenuItem t = (ToolStripMenuItem)sender;
ItemPointer p = (ItemPointer)t.Tag;
foreach (BaseClass bc in _baseClasses)
{
if (bc.GetType().Name == p.ClassType)
{
bc.Run(p.Index);
}
}
}
}