C50108
Search…
⌃K

2019/0429/物件導向技術原理方法實作

#物件導向技術原理方法實作

MVC大架構講完
接著物件導向技術原理方法實作

##原理

對於初學者來說不好懂有點抽象
不是底層現在程式設計幾乎都是物件導向
抽象化資料data abstraction 只有相對概念,多抽象多不抽象
物件(程式語言)導向(用這種習慣)
相對於
程序性導向
Int a ;
A=3 ;
If(a>0)
{print(a)}
缺點不易讀寫到哪就到哪不好維護不好學
會員資料管理(包含新增修改刪除列印)都在一隻程式內
藉由
模組化結構化成物件導向
分成新增修改刪除列印(分清楚)(likeusecase)
功能需求結構化 = usecase
功能拆開但彼此又是同一個大模組內
Usecase精隨就是 提前架構好
新增很抽象的話
就要增加它底層的usecase
新增包含 填入資料 驗證 送出資料 (相較於只講新增具體就是新增的抽象化
老師覺得知道頂或底會覺得怪所以才先教我們從矛點架構
企管跟公管對於系統架構較容易成為系統分析師
題外話:
微分 -> 應用經濟學 那 積分 ?
排列組合機率
回正題:
物件導向其實就是一種結構化的升級
物件概念(以現實生活中的東西去寫成程式)
Ex 文具<-筆 ( 白板筆 鉛筆 原子筆 鋼筆 )
頂:往上為抽象化一般化
底:往下為實現化具體化(弄得更趨近於現實
文具 ( 筆 噴槍 立可白 橡皮差 尺 圓規 ) XXXX
文具 ( 繪圖工具 修正工具 測量工具 ) OOOO
歸類(抽象化一般化往上)不一定有幾層看你要多細
物件導向 – 類別 ( 把物件歸類各種類別 )

###實作類別就是實作物件抽象化一般化分類

剔除差異只找共同特徵
物件 ( 類別的具體化 ) 實現(往下)出來就是物件
成員member
屬性 物件有什麼
方法 物件會什麼
解釋完物件與類別來實作一下
新增保護資料夾 ( 客戶端沒辦法跟伺服器要求看這個檔案
Random r = new Randow();
TextBox tb = new TextBox()
TextBox tb2 = new TextBox()
TextBox tb3 = new TextBox()
類別 物件 = 新的 建構子
TextBox名字不一樣但有一樣的特徵
現階段有相同的方法相同的屬性(接下去可能會不一樣)

##實作定義自己的類別

App_code加入新類別
C#裡面檔名叫什麼類別就會叫什麼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace back_end.App_Code
// 命名空間 專案名稱
// 別的專案要使用就要using過去 別的專案也可以一個類別同樣名稱(因為命名空間不一樣)
{
public class Person
// 修飾詞 類別 類別名稱
{//field 特徵欄位(屬性)
}
}

###系統分析文件 類別圖

##類別鑄造物件

屬性視窗 建置動作 內容改為編譯
建置編譯過後就可以using Person近來鑄造物件
Namespace必須要注意路徑不然引用不進來

###建構子其實是一種方法功能為鑄造物件,建構出來的物件具有括弧可帶參數。

物件後面打點因該要有屬性方法事件成員
人資會先塞選條件 然後才會pass到部門
當50都通過它也不會全pass過去
送25壓25人在手上
所以很大關係是靠緣分
620會有廠商來招募 可以投不是相同職類相關的
可以定義屬性內容(需要符合定義型態
以上為物件實作
類別 ( 設計圖概念
物件 ( 設計圖做出來的東西
Tb.id=”TextBox1”;
Tb.text=”abcde;
板手形狀icon都是屬性 ( 上面的person還沒定義成屬性所以都是欄位 field )

##封裝

類別實作項目就叫封裝(資訊隱藏)
閃電形狀事件
正方形紫色為方法
類別裡面定義的東西在使用類別的時候是看不到的
不必知道怎麼被實做出來的
為何需要封裝?

##修飾詞

修飾詞 有三種等級
Public 公開 任何人都可存取
Protected 保護 除了同類別 繼承類別的成員也可以存取
Private 私有 (C#沒有加修飾詞預設 ( 只有同一類別的其他成員可以存取

###實作時必須封裝成屬性不可以用field

欄位為何不可以直接存取?
避免不合理的輸入 如 年齡 age int = -18 ( 年齡不可能為負數

###Field欄位封裝為attibut屬性

屬性不成文的寫法第一個字要大寫
Public string Name
{
Get{name = “第一名” return name;}; //取值
set; //給值
}

###既然封裝為何會使用物件?

必須去看系統文件,只要知道怎用不用知道過程,
只要知道結果,不須知道為什麼。

###只有封裝的人知道過程跟為什麼

因為封裝的時候沒有set
可以很複雜的封裝
控制項其實都是物件,怎麼用就要看文件,沒有留文件封裝後就只剩封裝的人知道怎麼用。

###欄位field是私有private的所以透過公開public屬性存取欄位field並做一些限制

就像bootstrap inclued進來還可以改核心
但也有問題
所以才會有後續 多型多載等等 …
接著

##實作方法

###說話方法Speak()

修飾詞 return
回去的資料型態
方法名稱(方法參數資料型態 方法參數名稱) {方法內容}
Public string Speak(string content){return name+”講了”+content;}
Response.write(speak);
方法分為(不傳參數與傳參數)
/// 教人如何使用你建構的物件

###37OO_Person.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ASPnet.App_Code;
namespace ASPnet
{
public partial class _37OO_Person : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Random r = new Random();
TextBox tb = new TextBox();
//TextBox tb2 = new TextBox();
//TextBox tb3 = new TextBox();
//TextBox tb4 = new TextBox();
//TextBox tb5 = new TextBox();
Person Mary = new Person();
//Response.Write(Mary.Name);
Response.Write(Mary.Jump());
Person Jason = new Person();
Jason.Name = "Jason Lee";
Jason.Age = -18;
string speak= Jason.Speak("我是一個大帥哥!!");
Response.Write(speak);
////Jason.gender = true;
////Jason.height = 172;
//Jason.weight = 68.5M;
////Jason.name = "Jason Lee";
}
}
}

###App_Code/ Person.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ASPnet.App_Code
{
public class Person
{
//field
string name= "第一名";
int age;
bool gender;
decimal height;
decimal weight;
//Attibute(屬性)
public string Name
{
get
{
if(string.IsNullOrEmpty(name))
name = "第一名";
return name;
}
set
{
if(!string.IsNullOrEmpty(value))
name = value;
}
}
public int Age
{
get
{
return age;
}
set
{
if (value < 0)
age = 0;
else
age = value;
}
}
public decimal Height
{
get
{
return height;
}
set
{
if (value < 0)
height = 5;
else
height = value;
}
}
public decimal Weight
{
get
{
return weight;
}
set
{
if (value < 0)
weight = 1;
else
weight = value;
}
}
public bool Gender
{
get { return gender; }
set { gender = value; }
}
//方法
//說話(Speak())方法
/// <summary>
/// 請傳入要說的話
/// </summary>
/// <param name="content"></param>
/// <returns></returns>
public string Speak(string content)
{
return name + "講了「" + content + "」";
}
public string Jump()
{
return name + "嚇了一跳!!";
}
}
}

##(方法的)多載 同一個類別裡面有很多相同名稱的方法

參數數量不同或是資料型態不同,都可以做多載

##繼承 子會繼承父結點特性

共同屬性共同方法
排除相異的屬性
先不管值
不應該實作那麼多相同屬性的類別
應該拉出一個父類別讓另外幾個子類別繼承相同屬性
建置動作改成編譯
冒號就是:繼承
有了繼承鑄造出來的類別就有了更多的實用性
甚至可以往上下 狗跟人 都是動物
繼承跟鏈結有點像 只要繼承一個 就會繼承所有父類別特性(屬性與方法)
人貓狗牛 speak 的內容到底要 return什麼呢?
人是幹 貓是喵 狗是汪 牛是牟
只好使用以下

##同名異式 = 多型

實務上其實是系統分析師要把這個規格圖畫好
程式設計師直接寫完就好

###抽象類別 方法式子實作不出來時使用

通常只做方法名稱不做內容 又稱為抽象方法
但也可以做一般方法(裡面有商業邏輯的)
就不用寫 abstract 但要return 數值
抽象類別多型後在子類別內屬性會出現綠色蚯蚓符號,但多載的就不會出現。
這時就要再 前面加上前置詞 override
子類別內實作自己的方法並且覆蓋掉父類別
根本不會去實作那個抽象方法 因為它做出來沒有用 它就是要被覆蓋的
多型 = 動態多載
靜態 = 靜態多載 寫死在那個類別裡面
子輩
孫子輩

###再來多型理解不困難但很難應用

後端39舉例
抽象類別不用 new 沒有建構子概念 直接宣告就好
最後那串為同名異式多型 上面判斷完後 就會將子類別傳入 anima抽象類別並覆蓋掉l 抽象類別的屬性然後 才去呼叫 父類別方法speak()
此後置程式碼 只有類別鑄造的物件 沒有變數
那如果 動物裡面的 蜜蜂 魚不會叫speak() 還要繼承動物嗎?
除了抽象類別以外
還有個方式

##介面interface

對於魚這個類別來說是沒有speak()這個方法
難道要把人拆100種嗎?
且對於狗來說要怎實作雙繼承呢?
且類別無法多重繼承
但介面interface可以多重繼承
也可以全部做介面而不做抽象類別
子類別無法通用父類別 所以才要有 interface
通常介面檔名前面會寫一個 I 才接介面名稱 IAnimalSpeak / IAnimalSpeak
介面是一個非常彈性的技巧

###介面不可以實作方法內容,只要宣告即可,必須要靠繼承它的人來實作

介面不需要 override 覆蓋 只有抽象類別需要
可以多重繼承
可以實作多型
39 改為混和抽象多型&介面多型

程式碼

Flag 旗標?? True 執行 a falus 執行b

前端

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="39OO_Polymorphism.aspx.cs" Inherits="ASPnet._39OO_Polymorphism" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:RadioButtonList ID="RadioButtonList1" runat="server">
<asp:ListItem Text="人"></asp:ListItem>
<asp:ListItem Text="狗"></asp:ListItem>
<asp:ListItem Text="貓"></asp:ListItem>
<asp:ListItem Text="魚"></asp:ListItem>
</asp:RadioButtonList>
<asp:Button ID="Button1" runat="server" Text="按我就叫(類別)" OnClick="Button1_Click" />
<hr />
<asp:Label ID="Label1" runat="server"></asp:Label>
</div>
</form>
</body>
</html>

後端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ASPnet.App_Code;
namespace ASPnet
{
public partial class _39OO_Polymorphism : System.Web.UI.Page
{
Animal animal;
IAnimalMove imove;
IAnimalSpeak ispeak;
Dog dog = new Dog();
Cat cat = new Cat();
Person person = new Person();
Fish fish = new Fish();
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
int flag = 1;
if (RadioButtonList1.Items[0].Selected)
animal = person;
else if (RadioButtonList1.Items[2].Selected)
animal = cat;
if (RadioButtonList1.Items[1].Selected)
{
imove = dog;
ispeak = dog;
flag = 2;
}
else if (RadioButtonList1.Items[3].Selected)
{
imove = fish;
flag = 3;
}
if (flag==1)
{
Label1.Text = animal.Speak();
Label1.Text += animal.Move(5);
}
else if (flag == 2)
{
Label1.Text = ispeak.Speak();
Label1.Text += imove.Move(8);
}
else if (flag == 3)
{
Label1.Text = imove.Move(8);
}
}
}
}

##建構子 建構函數(函式)

###建構子的功能為 鑄造物件

食譜食材為類別
主菜的方法為建構子
煮完的東西為物件
方法一定要依附物件 (一定要有類別來定義方法 )
函式可以單獨存在
物件導向就不會單獨存在肯定寫在class裡面
每一頁asp
其實都是一個獨立的類別Class
不能用數字當開頭
所以會多了 _ 且繼承 page類別
建構子的概念就是 鑄造類別的時候
Person Josh = new Person()

###必須長的跟classname相同名稱該方法即為建構子

###沒宣告的時候預設的建構子 public Person(){} 之前可以用 都是用預設的

###宣告的時候建構子可以實作多載

實作建構子鑄造物件
套用到 asp.net 建構子 類別 與 物件
接著大概就是部屬了 如何部屬到iis或阿帕契上