タイプAのパラメーターをパラメーターとして期待している代理人がいます。したがって、Aは基本クラスです。クラスBとCはAから継承します。
問題は、BとCが基本クラスAから継承しているにもかかわらず、スクリプトの下部にあるDoSomething関数をデリゲートに変換できないことです。
public class A { }
public class B : A { }
public class C : A { }
public delegate void CallbackAction(params A[] paremeters);
public class Main
{
public int main(params string[] args)
{
CallbackAction callbackAction;
callbackAction = DoSomething1;
callbackAction = DoSomething2;
callbackAction = DoSomething3;
return 0;
}
public void DoSomething1(A arg0) { }
public void DoSomething2(B arg0) { }
public void DoSomething3(C arg0) { }
}
デリゲートでparamsを使用し、paramsクラスを基本クラスとして持つクラスを使用できるようにする方法はありますか?
エラーをコンパイルすると、次のようになります。エラー5「DoSomething3」のオーバーロードはデリゲート「SKConsole.CallbackAction」と一致しません
.NET4とXNAを使用しています
編集:: わかりました、なぜ私がこれを使用しているのか説明させてください私はコンソールを作成しています。これは、私のコンソールを使用しているプログラマーがコマンド(console.AddCommand( "help"、Help))をコンソールに追加できることを意味します。ここでのヘルプは関数です。ゲーム内でコンソールにヘルプを入力すると、関数Help()が実行されます。 。これで、console.AddCommand( "setSpeed"、SetPlayerSpeed)でも機能するようにします。SetPlayerSpeed関数には1つのパラメーター、intがあります。ただし、任意の関数で機能するようにしたいので、プログラマーが関数DoSomeFancyStuff(float a 、string b、int c)コンソールでコマンドを作成し、コンソールに正しい文字列を入力した場合は、これらのコマンドを実行します。
私はすでにさまざまな機能のためにたくさんのデリゲートを作成しようとしましたが、これは私の意見ではちょっと醜いです。
それから私が試したのは次のことでした
public abstract class SKConsoleParameter
{
protected string value;
public SKConsoleParameter(string value)
{
this.value = value;
}
public string GetRawValue()
{
return value;
}
public abstract bool IsValid();
public abstract object GetValue();
}
public class StringParam : SKConsoleParameter
{
public StringParam(string value) : base(value) { }
public override bool IsValid()
{
return true;
}
public override object GetValue()
{
return value;
}
}
public class IntParam : SKConsoleParameter
{
public IntParam(string value) : base(value) { }
public override bool IsValid()
{
int i;
return int.TryParse(value, out i);
}
public override object GetValue()
{
int i;
if (int.TryParse(value, out i))
return i;
else
return 0;
}
}
これは、開発者が次のような関数を作成した場合です。
DoSomethingCool(StringParam s, IntParam i)
次に、(string)s.GetValue()と(int)i.GetValue()を使用して値を受け取ることができます。StringParamクラスとIntParamクラスはどちらもSKConsoleParameterを継承しているため、次のデリゲートを作成できます。
void CoolDelegate(params SKConsoleParameter[] parameters)
しかし、これは機能しません。このページの上部にあるクラスA、B、およびCの抽象的な問題のため。
誰かがこの問題に対抗するためのアイデアを持っていますか?