封裝:把細節屏蔽,只留一個功能。
繼承:複用,拿來主義。
多態:同一種行爲,針對不同的對象,得到不同的結果。
同一個對象,得到不同的狀態。
面向過程:一步步的解決問題,親自親爲。
面向對象:你需要完成某件事,你就去找一個對象,讓它去完成(你要計算,那就從兜裏掏出手機,打開計算器就可以了)。
面向過程到面向對象的轉變就是“執行者”到“命令者”的轉變。
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;
}
}
}