私はMonoGameプロジェクトのUIシステムで作業しています。基本クラスから継承したネストされたクラスを返します
UserInterface
という大きなクラスを作成しました。このクラスの内部には、UIObject
という1つの基本クラスから継承する、Button
,Checkbox
、Scrollbar
などのネストされたクラスがあります。 UI上のすべてのオブジェクトはSystem.Collections.Generic.List<UIObject>
canvas
というプライベートな場所に保存されます。
このクラスを使用するプログラマは、publicメソッドUserInterface.Add(string name, UIObject obj)
を使用して、キャンバスに簡単に新しいオブジェクトを追加できます。プログラマーがキャンバスにオブジェクトを追加すると、プログラマーはそのオブジェクトをリストに見つけることができるように名前を割り当てます。
特定の名前を持つオブジェクトを返すパブリックメソッドを作成しようとすると、私の問題が発生します。
私の試みが好きになりますこの:
public UIObject GetObject(string nameOfObject)
{
return canvas.System.Linq.FirstOrDefault(o => o.Name == nameOfObject);
}
問題:このメソッドによって返されるオブジェクトは、常に元のオブジェクトが属するUIObject
なく継承クラスです。つまり、元のクラスのプロパティにアクセスすることはできません。私はキャンバス上Button
が押されたかどうかをチェックしたい場合たとえば、私はどうなる次
UserInterface ui = new UserInterface();
ui.Add("nameOfButton", new Button());
if (ui.GetObject("nameOfButton").IsPressed)
{
// Do stuff
}
プロパティIsPressed
がButton
クラスと返されたオブジェクトに属しているためしかし、これは動作しません。 UIObject
です。
キャンバスから元のタイプを使用してオブジェクトを返すにはどうすればよいですか?
解決済み:
私にジェネリックスを指してくれたAustin Brunkhorstに大きな感謝!
の作業方法:
public T GetObject<T>(string nameOfObject) where T : UIObject
{
return canvas.System.Linq.FirstOrDefault(o => o.Name == nameOfObject) as T;
}
方法は、そのように呼ばれている:
UserInterface ui = new UserInterface();
ui.Add("nameOfButton", new Button());
if (ui.GetObject<Button>("nameOfButton").IsPressed)
{
// Do stuff
}
ボタンとして((ui.GetObject( "nameOfButton"))場合 '行います。IsPressed) 'あなたのために働く? – Enigmativity
スタックオーバーフローへようこそ!あなたの質問を明確にする時間をとっていただきありがとうございます。 –
問題の解決策を見つけた場合は、タイトルに「解決済み」を入れたり、解決策を質問に追加したりしないでください。これらのことのどちらも、UIで解決された問題のマークにはなりません。代わりに、下の[あなたの答え]ボックスにあなたのソリューションを入れて、あなたの問題を最もよく解決した答えの左上にある緑色のチェックマークをクリックしてください。あなた自身の解決策を答えとしてマークすることはOKです。これはあなたの質問をUIで解決されたものとしてマークし、他の人が解決策を見つけるのを容易にします。 –