无法提取通用接口

时间:2014-03-18 00:28:01

标签: oop design-patterns interface abstract-class

我想创建一个可以在不同数字基础之间切换的计算器应用程序。就输入数字而言,我认为以下是灵活的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的类型不正确,则抛出异常。我觉得这是错误的,而且我错过了一些东西。还有另外一种方法吗?甚至可以为两个不同数量的基础计算器创建一个通用接口吗?

2 个答案:

答案 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创建一个多基计算器,只需使用基本选择来设置基数值来解析或打印数字。您还想限制输入按钮(假设您正在使用按钮),但这只是一个计数问题。