日期:2014-05-20  浏览次数:20666 次

[求助]用java实现简单工厂模式下的计算器程序时出现的问题,求大侠指教!
实现工厂类时,函数createOperation声明返回值为Operation类型,实际返回值为它的子类,也就是具体的操作实现类,这种方式在C#中是没有问题的,为什么在java中会报错?


产品类实现如下:---------------------

//运算操作抽像类
public abstract class Operation
{
    public double NumberA = 0;//接口中的成员变量默认为final,所以未使用接口。
    public double NumberB = 0;
    
    public abstract double GetResult();
}

//运算操作具体类
class OperationAdd extends Operation
{
public double GetResult()
{
return NumberA + NumberB;
}
}

//运算操作具体类
class OperationSub extends Operation
{
public double GetResult()
{
return NumberA - NumberB;
}
}

//运算操作具体类
class OperationMul extends Operation
{
public double GetResult()
{
return NumberA * NumberB ;
}
}

//运算操作具体类
class OperationDiv extends Operation
{
public double GetResult()
{
if(NumberB == 0)
{
System.out.println("[error]Number B is zero!");
return 0;
}
return NumberA / NumberB;
}
}


工厂类实现如下:

public class OperationFactory 
{
   public static Operation createOperation(char optType)  
   --这里报错了,提示“此方法必须返回Operation类型的结果”
   {
   switch(optType)
   {
   case '+':
   return new OperationAdd();
  // break;
   case '-':
   return new OperationSub();
   //break;
   case '*':
   return new OperationMul();
   //break;
   case '/':
   return new OperationDiv();
   //break;    
   }
   }
   
}

------解决方案--------------------
其实没什么错,就是你的switch里面没有写default, 所以编译器认为你应该在switch括号外再加一个return。

所以要么就在swtich里加上defaut, 像这样:

        switch(optType)
        {
            case '+':
                return new OperationAdd();
            // break;
            case '-':
                return new OperationSub();
            //break;
            case '*':
                return new OperationMul();
            //break;
            case '/':