この質問にはすでに答えがあります。
Javaでは、次のことができます。
Java
public class Button {
private Callback callback;
public Button(Callback callback) {
this.callback = callback;
}
public void update() {
// Check if clicked..
callback.onClick(this);
}
public interface Callback {
public void onClick(Button Button);
}
}
そしてそれを次のように使います。
Button b = new Button(new Callback() {
@Override
public void onClick(Button b) {
System.out.println("Clicked");
}
});
(Unity)C#でも同じことが可能かどうか、私は思っています。
現在、私は正しい構文で、同じ設定をしています
C#:
public class Button {
private Callback callback;
public Button(Callback callback) {
this.callback = callback;
}
public void Update() {
// Check if clicked..
callback.OnClick(this);
}
public interface Callback {
void OnClick(Button button);
}
}
しかし、ボタンを作成するときに同じことをやろうとすると、
Button b = new Button(new Button.Callback() {
void OnClick(Button button) {
Debug.Log("Clicked");
}
});
私はのようなエラーが出ます:
Unexpected symbol 'void'
error CS1526: A new expression requires () or [] after type
error CS8025: Parsing error
私は、インターフェイスでメソッド 'virtual'または 'abstract'を作成するか、void OnClick(..ボタンを作成するときは..これまでのところうまくいきません)の前に 'new'キーワードを追加してみました。
「new Button.Callback」から「()」を削除すると、予期しない「void」エラーが消えるようです。
私はここでいくつかの助けに感謝します。
あなたがやろうとしていること(すなわち匿名インターフェース)はC#では不可能です。しかし、あなたは使用することができますdelegates
似たようなことを達成するために
public class Button {
private Action<Button> action;
public Button(Action<Button> action) {
this.action = action;
}
public void Update() {
// Check if clicked..
action(this);
}
}
その後、
Button b = new Button(delegate(Button button) { Debug.Log("Clicked"); });
あるいは、ラムダ式を使うと、見やすくなります。
Button b = new Button(button => Debug.Log("Clicked"));
Action
基本的には関数を表すジェネリック型、特に戻り型がの関数です。void
。したがって、シグネチャに準拠している限り、既存のメソッドを渡すことができます。void Method()
。型パラメータを指定した場合(Action<T>
(構文)表現された関数が受け入れる引数の数と型を指定しているので、Action<Button>
を返す関数です。void
そして型の単一の引数を取りますButton
あなたのようにCallback.OnClick
方法。
匿名のデリゲートやラムダ式を使う代わりに(例えば上記のように)、期待されるシグネチャに準拠したメソッドを渡すことができます。
void OnClick(Button button)
{
Debug.Log("Clicked");
}
そしてそれを渡します、
Button b = new Button(OnClick);
あなたは探しているEvent handlers:
たぶん、あなたはこのようなものが欲しいです:
public delegate void Callback(Button btn);
public class Button
{
public event Callback Click;
public Button(Callback callback)
{
Click += callback;
}
public void Update()
{
// Check if clicked..
if (Click != null)
{
Click(this);
}
}
}
使用法:
Button btn = new Button( b => Debug.Log("Clicked"));
私はあなたが必要とするのはこのような最終クラスにあなたのインターフェースを実装することだけであると思います:
public class SomeClass: Callback
{
public SomeClass()
{
Button b = new Button(this);
}
void OnClick(Button button)
{
Debug.Log("Clicked");
}
}