關于記錄機動車輛輪胎銷售的基本 OOP 程式中代碼重用的簡單/初學者問題。
輪胎存盤在一個陣列中:
public Tyre[] tyres = new Tyre[5];
我有兩種形式。
Form1 最終用戶只需使用當前庫存專案(輪胎)的組合/查找來選擇專案。
public partial class Form1 : Form
{
Fitting fitting;
public Tyre[] tyres = new Tyre[5];
Tyre currentTyre;
public Form1()
{
InitializeComponent();
//populate array with tyres
tyres[0] = new Tyre("155/80S13", 56.00m, 10);
tyres[1] = new Tyre("165/70P15", 42.00m, 10);
tyres[2] = new Tyre("195/70S13", 46.00m, 10);
tyres[3] = new Tyre("158/90S19", 70.00m, 10);
tyres[4] = new Tyre("185/66R13", 66.00m, 10);
}
// search through array to find current selected tyre
public Tyre findTyre(string tyretype)
{
for (int i = 0; i < tyres.Length; i )
{
if (tyretype == tyres[i].Type)
return tyres[i];
}
return null;
}
private void cmbTyreType_SelectedIndexChanged(object sender, EventArgs e)
{
currentTyre = findTyre(cmbTyreType.Text);
lblPrice.Text = currentTyre.Price.ToString();
lblStockQ.Text = currentTyre.StockQty.ToString();
}
findTyre ()方法定義為:
public Tyre findTyre(string tyretype)
{
for (int i = 0; i < tyres.Length; i )
{
if (tyretype == tyres[i].Type)
return tyres[i];
}
return null;
}
表格 2 ( AddStock ) 在此表格上,最終用戶當前再次使用類似的組合/查找來查看輪胎范圍(就像在表格 1 上一樣)
public partial class AddStock : Form
{
Form1 frm2;
Tyre currentTyre;
public AddStock(Form1 frm)
{
frm2 = frm;
InitializeComponent();
for (int i = 0; i< frm.tyres.Length ; i )
{
cmbTyreType.Items.Add(frm.tyres[i].Type);
}
}
public Tyre findTyre(string tyretype )
{
for (int i = 0; i < frm2.tyres.Length; i )
{
if (tyretype == frm2.tyres[i].Type)
return frm2.tyres[i];
}
return null;
}
private void cmbTyreType_SelectedIndexChanged(object sender, EventArgs e)
{
currentTyre = findTyre(cmbTyreType.Text);
lblCurrentQ.Text = currentTyre.StockQty.ToString();
}
我擔心的是我不得不再次重新定義findTyre(),盡管它已經在 Form1 中定義了。我的希望是(可能是不明智的)我可以重新使用 Form1 中的 findTyre() 方法,但 Visual Studio 阻止了我。
原因可能是 findTyre() 方法系結到實體,使其在類外無法訪問?
uj5u.com熱心網友回復:
創建一個管理輪胎的類:
public class Tyres
{
private Tyre[] tyres = new Tyre[5];
public Tyre this[int i]
{
get { return tyres[i]; }
set { tyres[i] = value; }
}
public Tyre findTyre(string tyretype )
{
for (int i = 0; i < frm2.tyres.Length; i )
{
if (tyretype == frm2.tyres[i].Type)
return frm2.tyres[i];
}
return null;
}
}
不要在表單之間傳遞陣列,而是傳遞此類的一個實體。此類還可以包含更具體的方法,這些方法對您的輪胎進行操作。這是 OOP 的一個基礎:將資料和作用于該資料的方法保持在一起(在一個類中)。這也有助于您將邏輯與 GUI 分離。想象一下,您想將您的 winforms 應用程式更改為控制臺或 Web 應用程式。在這種情況下,您可以重用輪胎類。搜索輪胎與 GUI 無關,這就是它不屬于表單類的原因。
uj5u.com熱心網友回復:
在 AddStock 中你不能只使用 Form1 中的 findTyre 方法嗎?
currentTyre = frm2.findTyre(cmbTyreType.Text);
uj5u.com熱心網友回復:
似乎您可以從以下位置致電 findTyreForm1
public Tyre findTyre(string tyretype)
=> frm2.findTyre(tyretype)
uj5u.com熱心網友回復:
為什么 findTyre 方法在 forms 類中,而不是在 Tires 類中?在您的情況下,我只需將 Tire 物件類中的方法移動到靜態并為該方法添加一個新引數。
在你的程式中有重復的方法永遠不是一件好事。原因是如果該方法改變了功能,您將不得不在整個程式中的任何地方更改它,而不是一個。還要始終嘗試將您的物件特定代碼系結到您的物件類。所以你知道如果你需要一個與輪胎相關聯的方法,你只需要查看輪胎類,而不是通過所有的類來尋找它。
我建議您還閱讀以下文章,這是對關注點分離的解釋:https ://www.castsoftware.com/blog/how-to-implement-design-pattern-separation-of-concerns
public static Tyre findTyre(string tyretype, Tyres[] Tyres )
for (int i = 0; i < tyres.Length; i )
{
if (tyretype == tyres[i].Type)
return tyres[i];
}
return null;
}
我還建議您實施以下答案中提供的代碼@SomeBody。將使您的代碼更清潔,更可持續。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430014.html
