【发布时间】:2012-01-12 23:22:13
【问题描述】:
我在使用泛型时遇到了问题。我正在创建一个名为IProblem 的界面,其中每个问题都有结果(答案)和结果(如果正确)
public interface IProblem<T>
{
ushort ResultCount { get; }
T[] Results { get; }
bool IsCorrect();
}
public abstract class ProblemBase<T> : IProblem<T>
{
private T[] _results;
private ushort? _resultCount;
public ushort ResultCount
{
get
{
if (_resultCount == null) throw new ArgumentNullException("_resultCount");
return (ushort)_resultCount;
}
protected set
{
if (_resultCount != value)
_resultCount = value;
}
}
public T[] Results
{
get
{
if (_results == null)
_results = new T[ResultCount];
return _results;
}
}
public abstract bool IsCorrect();
}
这是我创建算术问题的示例,称为ProblemA。 T 是 decimal 因为数组数据类型应该是十进制(其他问题可能有 string 或 int)
public class ProblemA: ProblemBase<decimal>
{
private decimal _number1;
private decimal _number2;
private Operators _operator;
public decimal Number1
{
get { return _number1; }
set { _number1 = value; }
}
public decimal Number2
{
get { return _number2; }
set { _number2 = value; }
}
public Operators Operator
{
get { return _operator; }
set { _operator = value; }
}
public decimal Result
{
get { return Results[0]; }
set { Results[0] = value; }
}
public ProblemA()
{
this.ResultCount = 1;
}
public override bool IsCorrect()
{
bool result;
switch (_operator)
{
case Operators.Addition:
result = this.Result == (this.Number1 + this.Number2);
break;
case Operators.Subtract:
result = this.Result == (this.Number1 - this.Number2);
break;
case Operators.Multiplication:
result = this.Result == (this.Number1 * this.Number2);
break;
case Operators.Division:
result = this.Result == (this.Number1 / this.Number2);
break;
default:
throw new ArgumentException("_operator");
}
return result;
}
}
我正在使用 MVVM,所以我想为每个包含 ProblemBase<T> 作为属性的问题创建一个 ViewModel,但是它是通用的,我想如果将 IProblemViewModel 作为通用的。
public interface IProblemViewModel : IViewModel
{
ProblemBase<T> Problem { get; set; }
}
我这么说是因为后来打算用ObservableCollection<IProblemViewModel>,所以我不确定我写IProblemViewModel或IProblemViewModel<T>是否没有问题。
提前致谢。
【问题讨论】:
-
顺便说一下,不要留下一个抛出 NotImplementedException() 等待其他地方的一些错误无法覆盖它的实现。执行
public abstract bool IsCorrect();,就抽象类而言,您实现了接口,但任何未能覆盖它的具体派生类都不会编译。 -
@JonHanna 感谢乔恩的提示,我还在学习它!我会记住的