public class Operation   
{   
private double _numberA = 0;   
private double _numberB = 0;   
public double NumberA   
{   
get   
{   
return _numberA;   
}   
set   
{   
_numberA = value;   
}   
}   
public double NumberB   
{   
get   
{   
return _numberB;   
}   
set   
{   
_numberB = value;   
}   
}   
public virtual double GetResult()   
{   
double result = 0;   
return result;   
}   
public static string checkNumberInput(string currentNumber, string inputString)   
{   
string result = "";   
if (inputString == ".")   
{   
if (currentNumber.IndexOf(".") < 0)   
{   
if (currentNumber.Length == 0)   
result = "0" + inputString;   
else   
result = currentNumber + inputString;   
}   
}   
else if (currentNumber == "0")   
{   
result = inputString;   
}   
else   
{   
result = currentNumber + inputString;   
}   return result;   
}   
}   
class OperationAdd : Operation   
{   
public override double GetResult()   
{   
double result = 0;   
result = NumberA + NumberB;   
return result;   
}   
}   
class OperationSub : Operation   
{   
public override double GetResult()   
{   
double result = 0;   
result = NumberA - NumberB;   
return result;   
}   
}   
class OperationMul : Operation   
{   
public override double GetResult()   
{   
double result = 0;   
result = NumberA * NumberB;   
return result;   
}   
}   
class OperationDiv : Operation   
{   
public override double GetResult()   
{   
double result = 0;   
if (NumberB == 0)   
throw new Exception("除数不能为0。");   
result = NumberA / NumberB;   
return result;   
}   
}   
class OperationSqr : Operation   
{   
public override double GetResult()   
{   
double result = 0;   
result = NumberB * NumberB;   
return result;   
}   
}   
class OperationSqrt : Operation   
{   
public override double GetResult()   
{   
double result = 0;   
if (NumberB < 0)   
throw new Exception("负数不能开平方根。");   
result = Math.Sqrt(NumberB);   
return result;   
}   
}   
class OperationReverse : Operation   
{   
public override double GetResult()   
{   
double result = 0;   
result = -NumberB;   
return result;   
}   
}   
public class OperationFactory   
{   
public static Operation createOperate(string operate)   
{   
Operation oper = null;   
switch (operate)   
{   
case "+":   
{   
oper = new OperationAdd();   
break;   
}   
case "-":   
{   
oper = new OperationSub();   
break;   
}   
case "*":   
{   
oper = new OperationMul();   
break;   
}   
case "/":   
{   
oper = new OperationDiv();   
break;   
}   
case "sqr":   
{   
oper = new OperationSqr();   
break;   
}   
case "sqrt":   
{   
oper = new OperationSqrt();   
break;   
}   
case "+/-":   
{   
oper = new OperationReverse();   
break;   
}   
}   return oper;   
}   
private void buttonAdd_Click(object sender, EventArgs e)   
{   
if (txtShow.Text != "")   
{   
oper = OperationFactory.createOperate(((Button)sender).Text);   oper.NumberA = Convert.ToDouble(txtShow.Text);   bOperate = true;   
}   
}   
private void buttonEqual_Click(object sender, EventArgs e)   
{   
if (txtShow.Text != "")   
{   
if (((Button)sender).Text != "=")   
{   
oper = OperationFactory.createOperate(((Button)sender).Text);   
}   
oper.NumberB = Convert.ToDouble(txtShow.Text);   
txtShow.Text = oper.GetResult().ToString();   
bOperate = true;   
}   
}   
http://topic.csdn.net/u/20100527/20/ef6f6986-c61b-4dbf-8a6b-a12d40fd3ee0.html