封装:把细节屏蔽,只留一个功能。
继承:复用,拿来主义。
多态:同一种行为,针对不同的对象,得到不同的结果。
同一个对象,得到不同的状态。
面向过程:一步步的解决问题,亲自亲为。
面向对象:你需要完成某件事,你就去找一个对象,让它去完成(你要计算,那就从兜里掏出手机,打开计算器就可以了)。
面向过程到面向对象的转变就是“执行者”到“命令者”的转变。
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Exercise
{
class Program
{
static void Main(string[] args)
{
//面向过程的计算器
Console.WriteLine("请输入第一个数:");
double dNum1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请输入第二个数:");
double dNum2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请输入运算符(+,-,*,/):");
string oper = Console.ReadLine(); // operation 运算
double res = 0;
bool isRight = true; // 是对的
switch (oper)
{
case "+": res = dNum1 + dNum2; break;
case "-": res = dNum1 - dNum2; break;
case "*": res = dNum1 * dNum2; break;
case "/": res = dNum1 / dNum2; break;
default: isRight = false; break;
}
if (isRight)
Console.WriteLine("{0} {1} {2} = {3}", dNum1, oper, dNum2, res);
else
Console.WriteLine("运算符出错");
// 面向对象的计算器
// 你要计算
// 从兜里掏出手机来,打开计算器
//计算器对象 = new 计算器();
//计算器对象.使用();
Calculator cal = new Calculator();
cal.Start();
}
}
}
Calculator.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Exercise
{
class Calculator
{
//定义字段
double dNum1;
double dNum2;
string oper;
//Start开始
public void Start()
{
while (true)
{
//输入数字与运算符
Input();
//计算
Calculating();
Console.Write("是否继续(yes,no):");
if (Console.ReadLine() == "no") break;
}
}
private void Input()
{
dNum1 = InputNumber("请输入第一个数:");
dNum2 = InputNumber("请输入第二个数:");
oper = InputOperation("请输入运算符(+,-,*,/):", "+,-,*,/".Split(','));
}
private void Calculating()
{
double res=0;
//switch (oper)
//{
// case "+":res = dNum1 + dNum2;break;
// case "-":res = dNum1 + dNum2;break;
// case "*":res = dNum1 + dNum2;break;
// case "/":res = dNum1 + dNum2;break;
// default: break;
//}
//Console.WriteLine("{0}{1}{2}={3}", dNum1, oper, dNum2, res);
res=Factory.CreatorInstance(oper).计算(dNum1, dNum2);
Console.WriteLine("{0}{1}{2}={3}", dNum1, oper, dNum2, res);
}
private double InputNumber(string msg)
{
while (true)
{
Console.WriteLine(msg);
string sNum1 = Console.ReadLine();
double fNum1;
if (double.TryParse(sNum1,out fNum1))
{
return fNum1;
}
}
}
private string InputOperation(string msg,string[] operation)
{
while (true)
{
Console.WriteLine(msg);
string oper = Console.ReadLine();
if (operation.Contains(oper))
{
return oper;
}
else {
Console.WriteLine("运算符不存在");
}
}
}
}
}
Factory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Exercise
{
class Factory
{
public static CalculatorBase CreatorInstance(string oper)
{
CalculatorBase cal=null;
switch (oper)
{
case "+": cal = new Addition(); break;
case "-": cal = new Substraction(); break;
case "*": cal = new Myltiplication(); break;
case "/": cal = new Division(); break;
default:
break;
}
return cal;
}
}
class CalculatorBase
{
public virtual double 计算(double dNum1,double dNum2)
{
// 不知道写什么,但是又不能返回有效数据,但是不反回又报错
// 抛异常
throw new Exception("exception...");
}
}
class Addition:CalculatorBase
{
public override double 计算(double dNum1, double dNum2)
{
return dNum1+ dNum2;
}
}
class Substraction : CalculatorBase
{
public override double 计算(double dNum1, double dNum2)
{
return dNum1 - dNum2;
}
}
class Myltiplication : CalculatorBase
{
public override double 计算(double dNum1, double dNum2)
{
return dNum1 * dNum2;
}
}
class Division : CalculatorBase
{
public override double 计算(double dNum1, double dNum2)
{
return dNum1 / dNum2;
}
}
}