C#_Winform_兩個Form之間想利用共同Class所建立的屬性傳值程式如何撰寫運作問題探討

在大概2016也就是一年前
曾經解決過有人對於  C# 視窗傳遞數值問題

C#_WindowsForm_跳頁x單向傳遞資料寫法_雙向傳遞資料筆記
http://coolmandiary.blogspot.tw/2016/08/cwindowsformx.html




那有需要前情回顧的朋友可以再去看看
在上一篇我將所要探討的主要問題
切分為三階段

我先嘗試解決看看如何做
1.兩個視窗的跳換

功能有了之後再嘗試看看
2.單向傳值(從Form1傳值到Form2)

最後返回來將功能給完整
3.雙向傳值




那在這陣子一個開發朋友
又在社團有遇到一個有趣的設計問題



好他主要是想要透過另一種設計方法
做兩個視窗數值的傳遞


他想要於方案中的專案中
設立
三個檔案
Form1、Form2、Class檔


那該  Class檔  特別的地方在於用來
設計為
會用到的所有屬性
在Form1中呼叫Class中的屬性進行Set

那麼如何在Form2中取得在Form1中所Set Class後的值呢?


這個朋友他說他參考了非常多範例
都是直接在Form表單內上面建立Class再進行呼叫
所以不需New出一個新物件


那這裡
提問的開發朋友有提供他寫的一小串程式碼
尋求幫助

Class1的程式檔內容


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Class1
{
string str_i;

public string Str_i
{
get
{
return str_i;
}
set
{
str_i = value;
}
}
}

好那這裡呢....由於沒有排版不是很好看
抱歉有點龜毛XDD

所以再重新排版一下
Notepad++  一直以來是我們的好朋友




 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Class1
{
 string str_i;

 public string Str_i
 {
  get
  {
   return str_i;
  }
  set
  {
   str_i = value;
  }
 }
}

使用
http://hilite.me
內嵌


經過排版後的程式碼我們可以清楚看到一個所謂的
屬性的封裝  概念---->  通常第一個字母我們會大寫表示










OK  那這個朋友他有點是想要用  OO的設計方法解決視窗傳遞數值問題


反正我就先建立出他要的三種檔案
兩個   Form 視窗檔案
一個   Class  cs 程式檔案



新增一個  專案
包含剛才所述的三種檔案


這裡的部分




那原先這個朋友的做法是
在  Form1 中實體化  Class所對應的物件

//Form1中呼叫Class方法
Class a = new Class();//Class是額外建立的class檔
a.屬性;








好然後   下方的留言串燒中
又有一些開發者專家又提到

像是   將class用 static修飾等等
因為原先提問的朋友他說
很多範例都是在Form表單內的上面建立Class再進行呼叫,
所以不用New出一個新物件


好這個紅色被標註起來的就是一個關鍵
是為何底下專家開發朋友們會回應的
用static來修飾可達成的原因


那由於
本身提問的朋友的目標是要
兩個Form之間想利用共同Class所建立的屬性傳值
而Class1是額外建立的Class檔,想用來分類所有屬性
Class1中是會用到的所有屬性


在Form1中呼叫Class中的屬性進行Set
那麼
如何在Form2中取得在Form1中所Set Class後的值?


我想的問題是
MyQuestion1
為何要讓兩個Form有共用的Class, 有捨麼用意???
MyQuestion2
捨麼叫做會用到所有屬性????


Ans1:
我們通常為了避免寫重複太多的Code會想將程式模組化
所以慢慢的會產生像是  function 的概念
當你又要再做一次相同既常出現的功能時直接模組調用
簡化程式

慢慢的就再衍生出物件的概念
做一個數學運算
就有一個Math的類別去幫忙我們統整出
一些常用的運算實作方法
都全定義一次 以便後續復用
所以才會有像是寫一些資料庫連線或是做底層事情
都會包了幾層變一個多層夾心餅乾概念
他們的最底層你會看到最真實的樣貌
會是一大串的程式碼~~~
OK  那你再想想假若沒將它們利用  物件去模組化
會發生捨麼恐怖的事情
重副程式碼多  然後不好維護判讀
長度過長等等問題孳生


Ans2:
會用到所有屬性
那其實答案也涵蓋於第一個問題的答覆之中
那以兩個視窗傳值作為思考的範本
最簡易情況而言
如果沒有特別去注重
就是所謂的功能有達成即可的話
以之前那篇文章為例









換言之
Q1. 他想問的是
我們有需要針對每次都要對物件中的方法去對物件實體化嗎
假若我有四五個物件那我一定要都先實體化後再去調用該物件所定義的方法嗎
講白話一些
就是一定要先New 個 5~6次嗎????


Ans:沒有必要!!!!

static修飾主要用途
若放置於  Class (物件設計藍圖)中其中一個方法的話
就是所謂的 static method
代表你不需要先建立(實體化)物件就可以直接用
該Class(設計藍圖名稱)去呼叫該方法喔!!!
直接用 Class名.xxx()  的方法名去調用


Class   跟   實體化出來的物件
差異在於
Class是  設計藍圖(有物件如何設計的規格、成分)
物件是  各個是獨立的  且各有各自的名稱,你也可以說它是有生命的單一個體

那這邊不多做贅述


有static method 當然也會有
static variable

static class


static variable
可直接透過Class名去調用該變數欄位!!!!!
所有只要是用該Class宣告實體化(New)出來的物件
都會共用同一個static變數



static class
無法實體化物件(不可被New出來)
為了防止物件的實體化 所以用static修飾

像是C#當中的Math 裡面包了一堆常用的數學運算
你不需要去實體化出來一個物件
直接通通用一樣的Class名去掉用實作方法即可








留言

  1. 回應版主問題:Form有共用的Class
    目的:不同的form可互相傳遞共同參數

    這狀況還是需要用到吧。

    回覆刪除

張貼留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題