Имам делегат, който очаква параметри от тип 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 като основен клас?
При компилиране грешката, която получавам, е: Грешка 5 Няма претоварване за „DoSomething3“ съответства на делегат „SKConsole.CallbackAction“
Използвам .NET 4 и XNA
РЕДАКТИРАНЕ:: Добре, позволете ми да обясня защо използвам това, създавам конзола. Това означава, че програмист, използващ моята конзола, може да добави команда (console.AddCommand("help", Help) към конзолата, Help тук е функция. Когато сте в играта и пишете help в конзолата, тя ще изпълни функцията Help() . Сега искам да работи и с console.AddCommand("setSpeed", SetPlayerSpeed). Функцията SetPlayerSpeed има 1 параметър, int. Но искам да работи с всяка функция, така че ако програмист създаде функцията DoSomeFancyStuff(float a , низ 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 в горната част на тази страница
Някой има ли идеи за справяне с този проблем?
((CoolDelegate)DoSomethingCool)(new IntParam ("1"), new StringParam ("foo"))
? - person Anton Tykhyy   schedule 27.02.2013