一.封裝
向對象程序設計中,一個非常重要的技術便是封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。這樣做的好處在於可以使類內部的具體實現透明化,只要其他代碼不依賴類內部的私房數據,你便可以安心修改這些代碼。此外,這樣做也是出於安全方面的考慮,如果代表網上支付卡密碼的變量隨便就可以被訪問到,這樣的系統誰還敢用呢?
訪問修飾符:
Private:只有類本身能存取.
Protected:類和派生類可以存取.
Internal:只有同一個項目中的類可以存取.
Protected Internal:是Protected和Internal的結合.
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;
}
}
上面 Operation類中字斷與方法 就實現了一個封裝。
二.多態
1、多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。
編譯時的多態性:
編譯時的多態性是通過重載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的參數、返回的類型等信息決定實現何種操作。
運行時的多態性:
運行時的多態性就是指直到系統運行時,才根據實際情況決定實現何種操作。C#中,運行時的多態性通過虛成員實現。
編譯時的多態性爲我們提供了運行速度快的特點,而運行時的多態性則帶來了高度靈活和抽象的特點。
2、實現多態:
- 接口多態性。
- 繼承多態性。
- 通過抽象類實現的多態性。
3、override關鍵字:
重寫父類中的virtual修飾的方法,實現多態。
實例代碼如下:
重寫方法,
繼承主要實現重用代碼,節省開發時間。
1、C#中的繼承符合下列規則:
- 繼承是可傳遞的。如果C從B中派生,B又從A中派生,那麼C不僅繼承了B中聲明的成員,同樣也繼承了A中的成員。Object類作爲所有類的基類。
- 派生類應當是對基類的擴展。派生類可以添加新的成員,但不能除去已經繼承的成員的定義。
- 構造函數和析構函數不能被繼承。除此之外的其它成員,不論對它們定義了怎樣的訪問方式,都能被繼承。基類中成員的訪問方式只能決定派生類能否訪問它們。
- 派生類如果定義了與繼承而來的成員同名的新成員,就可以覆蓋已繼承的成員。但這並不因爲這派生類刪除了這些成員,只是不能再訪問這些成員。
- 類可以定義虛文法、虛屬性以及虛索引指示器,它的派生類能夠重載這些成員,從而實現類可以展示出多態性。
2、new關鍵字
如果父類中聲明瞭一個沒有friend修飾的protected或public方法,子類中也聲明瞭同名的方法。則用new可以隱藏父類中的方法。(不建議使用)
3、base關鍵字
base 關鍵字用於從派生類中訪問基類的成員:
- 調用基類上已被其他方法重寫的方法。
- 指定創建派生類實例時應調用的基類構造函數
我把簡單計算器的源碼與類圖放上,看不懂再討論。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 簡單的計算器_封裝_繼承_多態_
{
class Program
{
static void Main(string[] args)
{
Operation oper;
Console.WriteLine("請輸入運算符:\r\n");
oper = OperationFactory.createOperation(Console.ReadLine());
Console.WriteLine("請輸入第一個數:\r\n");
oper.NumberA = int.Parse(Console.ReadLine());
Console.WriteLine("請輸入第二個數:\r\n");
oper.NumberB = int.Parse(Console.ReadLine());
double result = oper.GetResult();
Console.WriteLine("運算結果:\r\n");
Console.WriteLine(oper.NumberA.ToString() +"+"+ oper.NumberB.ToString() + "=" + result.ToString());
Console.ReadLine();
}
}
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;
}
}
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)
result = NumberA / NumberB;
else
Console.WriteLine("除數不能爲零!\n");
return result;
}
}
class OperationFactory //運算對象生產工廠
{
public static Operation createOperation(string operation)
{
Operation oper = null;
switch(operation)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
}
return oper;
}
}
}
本文整理來源:http://www.5ufanli.net