이 질문에는 이미 답변이 있습니다.
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 #에서는 불가능한 작업 (예 : 익명 인터페이스)을 수행 할 수 없습니다. 그러나, 당신은 사용할 수 있습니다.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);
당신이 찾고있는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");
}
}