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

나는 인터페이스에서 '가상'또는 '추상'메서드를 만들거나, void OnClick (.. 버튼을 만들 때 'new'키워드를 추가하려고 시도했지만, 지금까지는 행운이 없습니다.

'new Button.Callback'에서 '()'을 제거하면 예기치 않은 기호 'void'오류가 사라집니다.

여기 좀 도와 주셔서 감사합니다.


  • C #에있다.사건 - L.B
  • 현재 행운을 찾지 못해서 인라인 인터페이스라고 불렀습니다. 링크도 주셔서 감사합니다. - Snakybo
  • 화합 태그는 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"); });

또는 람다 (lambda) 표현식을 사용하면 더 간단 해 보이며,

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");
    }

}

연결된 질문


관련된 질문

최근 질문