你能帮助我吗?我是通用方法的新手。我一直在寻找答案,但找不到希望你可以提供帮助。 我尝试过拳击和拆箱但是错误。 这是我的代码。
if (input == 1)
{
Sum sum = new Sum();
InputTwoDegits<Sum>(out firstNumber, out secondNumber, out firstNumberChecker, out secondNumberChecker, input, sum);
factoryClass = sum;
factoryClass.Compute();
}
else if (input == 2)
{
Difference dif = new Difference();
InputTwoDegits<Difference>(out firstNumber, out secondNumber, out firstNumberChecker, out secondNumberChecker, input, dif);
factoryClass = dif;
factoryClass.Compute();
}
private static void InputTwoDegits<T>(out int firstNumber, out int secondNumber, out bool firstNumberChecker, out bool secondNumberChecker, int input, T returnClass) where T : class
{
T set = T(Sum);
firstNumberChecker = Int32.TryParse(Console.ReadLine(), out firstNumber);
//returnClass.FirstNumber = firstNumberChecker ? input : 0;
secondNumberChecker = Int32.TryParse(Console.ReadLine(), out secondNumber);
//returnClass.SecondNumber = secondNumberChecker ? input : 0;
}
public abstract class BaseClass
{
public BaseClass()
{
this.Compute();
}
public int FirstNumber { get; set; }
public int SecondNumber { get; set; }
public int ReturnObj { get; set; }
public abstract void Compute();
}
public class Sum : BaseClass
{
public override void Compute()
{
ReturnObj = FirstNumber + SecondNumber;
}
}
public class Difference : BaseClass
{
public override void Compute()
{
ReturnObj = FirstNumber - SecondNumber;
}
}
注释代码出错。我想设置T returnClass的值,以便我可以为其赋值。
感谢。
答案 0 :(得分:1)
错误是因为虽然您已指定T
是一个类,但您尚未定义该类的任何特征。但是,在您的代码中,您希望能够在T的实例上设置FirstNumber
和SecondNumber
。
解决此问题的一种方法是使用这些属性定义接口:
interface ISomeNumbers
{
int FirstNumber{get; set;}
int SecondNumber{get; set;}
}
然后让你的类型实现接口。现在,您可以在方法上指定通用约束:
private static void InputTwoDegits<T>(out int firstNumber, out int secondNumber, out bool firstNumberChecker, out bool secondNumberChecker, int input, T returnClass) where T : ISomeNumbers
现在,您可以设置属性,因为您告诉编译器您希望能够对T
的实例执行什么操作。
答案 1 :(得分:0)
您应该将此方法更改为:
private static void InputTwoDegits<T>(
out int firstNumber,
out int secondNumber,
out bool firstNumberChecker,
out bool secondNumberChecker,
int input,
T returnClass) where T : BaseClass // <---- constraint on BaseClass instead of Class
此外,您可能会更改此方法的签名,因此它会返回一些内容。
public override void Compute()
{
ReturnObj = FirstNumber + SecondNumber;
}