2017-12-16 24 views
2

私はMonoGameプロジェクトのUIシステムで作業しています。基本クラスから継承したネストされたクラスを返します

UserInterfaceという大きなクラスを作成しました。このクラスの内部には、UIObjectという1つの基本クラスから継承する、Button,CheckboxScrollbarなどのネストされたクラスがあります。 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 
} 

プロパティIsPressedButtonクラスと返されたオブジェクトに属しているためしかし、これは動作しません。 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 
}  
+0

ボタンとして((ui.GetObject( "nameOfButton"))場合 '行います。IsPressed) 'あなたのために働く? – Enigmativity

+0

スタックオーバーフローへようこそ!あなたの質問を明確にする時間をとっていただきありがとうございます。 –

+0

問題の解決策を見つけた場合は、タイトルに「解決済み」を入れたり、解決策を質問に追加したりしないでください。これらのことのどちらも、UIで解決された問題のマークにはなりません。代わりに、下の[あなたの答え]ボックスにあなたのソリューションを入れて、あなたの問題を最もよく解決した答えの左上にある緑色のチェックマークをクリックしてください。あなた自身の解決策を答えとしてマークすることはOKです。これはあなたの質問をUIで解決されたものとしてマークし、他の人が解決策を見つけるのを容易にします。 –

答えて

1

あなたが使用することを探しているタイプとしてUIObjectをキャストする必要があります。この場合、Button

Button slickButton = (Button)ui.GetObject("nameOfButton"); 

注意してください!オブジェクトが実際にはButtonでない場合、これは例外をスローします。

また、as演算子を使用できます。この演算子は、オブジェクトがButtonでない場合は、nullと評価されます。

Button slickButton = ui.GetObject("nameOfButton") as Button; 

私はあなたが明示的にあなたが期待してメソッドを持っているあなたのための魔法を行うタイプを示すことによって、これを避けることができるよう、ジェネリック医薬品に探してお勧めします。

Button slickButton = ui.GetObject<Button>("nameOfButton"); 

Casting Reference

関連する問題