2021/3/13 追記
わかりにくくて申し訳ないです。下記のコードは非常にシンプルにしたかったので、サンプルとなります。
publicがついてないのも申し訳ないです。ご指摘の通りですね・・・。
やりたかったこととしてはコールバック関数について
勉強しており、そういった実装がしたかったです。
Loop関数で値が特定以上になった際のコールバック関数を用意し、
別クラスからその処理を渡せるるようにしたいです。
調べてみるとdelegateとコールバック関数を使えばできるみたいなことが
書いてあったのですが、イマイチ理解できておらず・・・。
C#を勉強しており、下記のような処理ができないか模索しております。
あるクラスの処理が終わったタイミングで別のクラスの関数を呼び出したいです。
ラムダ式やデリゲートやらを使うとできるみたいなのですが、
どのように実装するのが正しいのでしょうか。
関数など登録?(₊= Func1)みたいな記述などが必要なのでしょうか。
C#
1class Test1 { 2 3 int val = 0; 4 int valMax = 60; 5 6 void Loop() { 7 val++; 8 if(val >= valMax){ 9 val = 0; 10 11 // ここでTest2のFunc1を呼びたい 12 13 } 14 } 15} 16 17class Test2 { 18 19 Test1 test = new Test1(); 20 21 void Loop() { 22 test.Loop(); 23 } 24 25 void Func1() { 26 print("test"); 27 } 28}
まず、何がしたいのかが分かりません。
なぜTest1で呼び出されるはずのTest2でTest1のインスタンスが生成されているのでしょうか。
やりたいことがいまいちわかりません。
失礼しました!分かりやすく書いたつもりだったのですが、余計ややこしくなっておりました。
コールバック関数みたいなのの実装方法を調べており、別クラスを呼び出したかった次第です。
class Test1 {
int val = 0;
int valMax = 60;
Action callback = null;
public Test1(Action callback)
{
this.callback = callback;
}
void Loop() {
val++;
if(val >= valMax){
val = 0;
// ここでTest2のFunc1を呼びたい
callback?.Invoke();
}
}
}
class Test2 {
Test1 test = new Test1(Func1);
void Loop() {
test.Loop();
}
void Func1() {
print("test");
}
}
回答者としては、結局何を回答すればよいのかがさっぱり分からないのですが。
.NET APIブラウザのActionのページの内容の他に、何の情報が必要なのでしょう?
正しい質問のタイトルは「コールバック関数を使って別クラスの関数を呼び出す方法」ではありませんか。
test.Loop(); も別クラスの関数を呼び出す1つの方法ですから、今のタイトルだともう実現していることになります。
今までの内容だと「どのように実装するのが正しいのか」という文章からコールバック関数を使わなくても、何らかの手段で別クラスの関数を呼び出せればOKという風に読めました
> 調べてみるとdelegateとコールバック関数を使えばできるみたいなことが
> 書いてあったのですが、イマイチ理解できておらず・・・。
その書いてあったページにサンプル等は書いてなかったのですか?Microsoft公式のAPIの説明まで目を通したのでしょうか。どのページで調べて、何を理解出来なかったかを教えてください。結局、あなたのdelegateに対する理解度は他者には不明なままです。
調べたのであれば、Web上のサンプルコード等を参考にしながら、エラーが出てうまく行かずとも、とりあえずdelegateを使った処理を書いてみてください。使い方が悪いだけであれば、そこは指摘できます。現状だと、特に自分であまり調べて試行錯誤してなさそうな印象を受けてしまうので、ただの調査の丸投げに感じてしまいます。
参考URLやサンプルコードだけぶん投げるのが一番楽ではあるんですが、C#勉強中とのことですので、結局理解していない人にサンプルを渡した所で、それで解決した気になって先に進んでしまうパターンが多いのであまり為にならないと思っています。
回答3件
あなたの回答
tips
プレビュー