1

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#は持っていますイベント - L.B
  • 今すぐ回答を見つけることができなくても、インラインインターフェイスと呼ばれることがわかりませんでした。リンクもありがとう。 - Snakybo
  • UnityタグはMicrosoft Unity用です。悪用しないでください。 - Lex Li

3 답변


2

あなたがやろうとしていること(すなわち匿名インターフェース)は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);


  • ですActionボタンクリックを処理するビルドインクラスまたはカスタムメイドのクラスのどちらですか。 - Snakybo
  • はい、それは基本的に関数を表すジェネリック型です。具体的には戻り型がvoid。したがって、シグネチャに準拠している限り、既存のメソッドを渡すことができます。void Method(Button button) - rae1
  • 私はそれがうまくいった、どうもありがとうございました! - Snakybo
  • 問題ない;助けてうれしい。 =) - rae1

2

あなたは探している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"));


2

私はあなたが必要とするのはこのような最終クラスにあなたのインターフェースを実装することだけであると思います:

public class SomeClass: Callback
{
    public SomeClass()
    {
       Button b = new Button(this);
    }


    void OnClick(Button button)
    {
        Debug.Log("Clicked");
    }

}

リンクされた質問


関連する質問

最近の質問