我想创建一个可以在不同数字基础之间切换的计算器应用程序。就输入数字而言,我认为以下是灵活的api:
public interface ICalculator
{
string Enter(INumberElement element);
}
public class BaseTenCalculator : ICalculator
{
public string Enter(INumberElement element)
{
...
}
}
public class BaseTwoCalculator : ICalculator
{
public string Enter(INumberElement element)
{
...
}
}
我的问题是,对于BaseTenCalculator,我想要一个方法
Enter(BaseTenNumberElement element)
对于BaseTwoCalculator,我想要一个方法
Enter(BaseTwoNumberElement element)
确保只输入该数字基数的有效数字。但是,我能想到强制执行此约束的唯一方法是向下转换'元素'两个不同实现中的参数,如果INumberElement的类型不正确,则抛出异常。我觉得这是错误的,而且我错过了一些东西。还有另外一种方法吗?甚至可以为两个不同数量的基础计算器创建一个通用接口吗?
答案 0 :(得分:4)
public interface ICalculator<in T> where T : INumberElement
{
string Enter(T element);
}
public class BaseTenCalculator : ICalculator<BaseTenNumberElement>
{
public string Enter(BaseTenNumberElement element)
{
throw new NotImplementedException();
}
}
public class BaseTwoCalculator : ICalculator<BaseTwoNumberElement>
{
public string Enter(BaseTwoNumberElement element)
{
throw new NotImplementedException();
}
}
答案 1 :(得分:1)
我认为你错误地想到了这个问题。数字是一个数字而不管基数。 Base只是数字的可见表示。一个很好的例子可能是BigInteger。它有一个构造函数:BigInteger(String val,int radix)和一个函数:toString(int radix)。表示数字的所有工作都是相同的。唯一不同的是从字符串表示解析为数字,然后返回到特定基数中的数字格式。
您可以使用下面的BigInteger或BigDecimal创建一个多基计算器,只需使用基本选择来设置基数值来解析或打印数字。您还想限制输入按钮(假设您正在使用按钮),但这只是一个计数问题。