实现工厂类时,函数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;
}
}
}
产品类实现如下:---------------------//运算操作抽像类
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;
}
}
}
{
case '+':
return new OperationAdd();
// break;
case '-':
return new OperationSub();
//break;
case '*':
return new OperationMul();
//break;
case '/':
return new OperationDiv();
//break;
default:
return null;
}
}
或者就在switch括号外加上
return null;