我正在使用Range<T>
class described in this answer。如何将范围<T>投射到IntRange?
我创建了下面的子类,以创建一系列特定类型的:
public class IntRange : Range<Int32>
{
public static List<IntRange> ParseRanges(string ranges)
{
//...
}
}
为了完成ParseRanges
功能,我需要投从Range<Int32>
到IntRange
。这是因为我呼吁我加入Range<T>
类的辅助功能:
//Create a range that automatically determines the min/max between two bounds.
public static Range<T> Create(T bound1, T bound2)
{
if (bound1.CompareTo(bound2) <= 0)
{
return new Range<T>() { Minimum = bound1, Maximum = bound2 };
}
else
{
return new Range<T>() { Minimum = bound2, Maximum = bound2 };
}
}
的方法调用看起来如下:
IntRange range = (IntRange)Create(2, 0);
首先,我明白,我不能合法地做这个演员,因为它可能为另一个人创建一个类:
public class VerySpecialIntRange : Range<Int32> { /* ... */ }
编译器无法知道Range<Int32>
应该是IntRange
还是VerySpecialIntRange
,因此当我尝试投射时它会吐出错误。
我该如何进行演员制作,以便我不需要为每个子类推出Create
函数?当然,我有我自己的源代码,并且可以相对容易地做到这一点,但如果Range<T>
是某个封闭的第三方库的一部分,并且我需要继承它,我不能轻易确定如何正确实现Create
函数。
为什么首先需要'IntRange'?只是为了包含静态方法'ParseRanges'?你有没有添加任何新的实例成员到'IntRange'? –
而不是为每个派生的'Range'类创建'Create'方法,**不要创建派生的'Range'类。只处理'范围'。密封它甚至。在另一个类中创建一个静态方法,如果需要,可以使用'string'并返回'List >;但是除了像这样继承'Range'之外,你得到的只是麻烦。 –
Servy
噢,'Range'最好是不可变的,而不是可变的。如果你想保持不变,比如说最大值实际上更大,那就更加正确了。如果它是可变的,那么有人可以违反那个不变量。 – Servy